commit 6d0159ad3469687180ba6bfeccdf7421557ce533 Author: mingchen <3177583214@qq.com> Date: Fri Apr 18 09:11:40 2025 +0800 feat(*):基本代码完成 diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..35410ca --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# 默认忽略的文件 +/shelf/ +/workspace.xml +# 基于编辑器的 HTTP 客户端请求 +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..c716fec --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/encodings.xml b/.idea/encodings.xml new file mode 100644 index 0000000..b9d561c --- /dev/null +++ b/.idea/encodings.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml new file mode 100644 index 0000000..be5f5c6 --- /dev/null +++ b/.idea/jarRepositories.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..0abcc97 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,12 @@ + + + + + + + + \ No newline at end of file diff --git a/api/log/blog-dev/spring.log-2025-04-17-0.log b/api/log/blog-dev/spring.log-2025-04-17-0.log new file mode 100644 index 0000000..b7e9c00 --- /dev/null +++ b/api/log/blog-dev/spring.log-2025-04-17-0.log @@ -0,0 +1,57 @@ +2025-04-17 09:39:41.724 INFO 5255 --- [main] com.mingchen.BlogApiApplicationTests : Starting BlogApiApplicationTests on mingchendeMac-mini.local with PID 5255 (started by mingchen in /Users/mingchen/code/java/other/legalAid/api) +2025-04-17 09:39:41.724 DEBUG 5255 --- [main] com.mingchen.BlogApiApplicationTests : Running with Spring Boot v2.2.7.RELEASE, Spring v5.2.6.RELEASE +2025-04-17 09:39:41.724 INFO 5255 --- [main] com.mingchen.BlogApiApplicationTests : The following profiles are active: dev +2025-04-17 09:39:41.975 INFO 5255 --- [main] .s.d.r.c.RepositoryConfigurationDelegate : Multiple Spring Data modules found, entering strict repository configuration mode! +2025-04-17 09:39:41.977 INFO 5255 --- [main] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data Redis repositories in DEFAULT mode. +2025-04-17 09:39:41.991 INFO 5255 --- [main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 9ms. Found 0 Redis repository interfaces. +2025-04-17 09:39:42.303 ERROR 5255 --- [main] c.b.m.core.MybatisConfiguration : mapper[com.mingchen.mapper.CategoriesMapper.getAllCategoriesWithLaws] is ignored, because it exists, maybe from xml file +2025-04-17 09:39:42.999 INFO 5255 --- [main] n.b.p.u.AbstractUserAgentAnalyzerDirect : - Loaded 90 files in 390 msec using expression: classpath*:UserAgents/**/*.yaml +2025-04-17 09:39:43.000 INFO 5255 --- [main] n.b.parse.useragent.utils.YauaaVersion : +2025-04-17 09:39:43.000 INFO 5255 --- [main] n.b.parse.useragent.utils.YauaaVersion : /-----------------------------------------------------------\ +2025-04-17 09:39:43.000 INFO 5255 --- [main] n.b.parse.useragent.utils.YauaaVersion : | Yauaa 5.20 (v5.20 @ 2020-11-22T15:39:16Z) | +2025-04-17 09:39:43.000 INFO 5255 --- [main] n.b.parse.useragent.utils.YauaaVersion : +-----------------------------------------------------------+ +2025-04-17 09:39:43.000 INFO 5255 --- [main] n.b.parse.useragent.utils.YauaaVersion : | For more information: https://yauaa.basjes.nl | +2025-04-17 09:39:43.000 INFO 5255 --- [main] n.b.parse.useragent.utils.YauaaVersion : | Copyright (C) 2013-2020 Niels Basjes - License Apache 2.0 | +2025-04-17 09:39:43.000 INFO 5255 --- [main] n.b.parse.useragent.utils.YauaaVersion : \-----------------------------------------------------------/ +2025-04-17 09:39:43.000 INFO 5255 --- [main] n.b.parse.useragent.utils.YauaaVersion : +2025-04-17 09:39:43.006 INFO 5255 --- [main] n.b.p.u.AbstractUserAgentAnalyzerDirect : Building all needed matchers for the requested 11 fields. +2025-04-17 09:39:43.150 INFO 5255 --- [main] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor' +2025-04-17 09:39:43.312 INFO 5255 --- [main] org.quartz.impl.StdSchedulerFactory : Using default implementation for ThreadExecutor +2025-04-17 09:39:43.315 INFO 5255 --- [main] org.quartz.core.SchedulerSignalerImpl : Initialized Scheduler Signaller of type: class org.quartz.core.SchedulerSignalerImpl +2025-04-17 09:39:43.316 INFO 5255 --- [main] org.quartz.core.QuartzScheduler : Quartz Scheduler v.2.3.2 created. +2025-04-17 09:39:43.316 INFO 5255 --- [main] org.quartz.simpl.RAMJobStore : RAMJobStore initialized. +2025-04-17 09:39:43.316 INFO 5255 --- [main] org.quartz.core.QuartzScheduler : Scheduler meta-data: Quartz Scheduler (v2.3.2) 'quartzScheduler' with instanceId 'NON_CLUSTERED' + Scheduler class: 'org.quartz.core.QuartzScheduler' - running locally. + NOT STARTED. + Currently in standby mode. + Number of jobs executed: 0 + Using thread pool 'org.quartz.simpl.SimpleThreadPool' - with 10 threads. + Using job-store 'org.quartz.simpl.RAMJobStore' - which does not support persistence. and is not clustered. + +2025-04-17 09:39:43.316 INFO 5255 --- [main] org.quartz.impl.StdSchedulerFactory : Quartz scheduler 'quartzScheduler' initialized from an externally provided properties instance. +2025-04-17 09:39:43.316 INFO 5255 --- [main] org.quartz.impl.StdSchedulerFactory : Quartz scheduler version: 2.3.2 +2025-04-17 09:39:43.316 INFO 5255 --- [main] org.quartz.core.QuartzScheduler : JobFactory set to: org.springframework.scheduling.quartz.SpringBeanJobFactory@665902eb +2025-04-17 09:39:43.367 INFO 5255 --- [main] o.s.s.web.DefaultSecurityFilterChain : Creating filter chain: any request, [org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter@3ad9f06a, org.springframework.security.web.context.SecurityContextPersistenceFilter@68769265, org.springframework.security.web.header.HeaderWriterFilter@5d6de24e, org.springframework.web.filter.CorsFilter@72cb5d7d, org.springframework.security.web.authentication.logout.LogoutFilter@4603845b, com.mingchen.common.config.JwtLoginFilter@19b89a23, com.mingchen.common.config.JwtFilter@6d1a4522, org.springframework.security.web.savedrequest.RequestCacheAwareFilter@68c1d547, org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter@7951a08c, org.springframework.security.web.authentication.AnonymousAuthenticationFilter@1835b24b, org.springframework.security.web.session.SessionManagementFilter@6dd0d9a2, org.springframework.security.web.access.ExceptionTranslationFilter@5680228, org.springframework.security.web.access.intercept.FilterSecurityInterceptor@b88d294] +2025-04-17 09:39:43.391 INFO 5255 --- [main] o.s.s.quartz.SchedulerFactoryBean : Starting Quartz Scheduler now +2025-04-17 09:39:43.391 INFO 5255 --- [main] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED started. +2025-04-17 09:39:43.395 INFO 5255 --- [main] com.mingchen.BlogApiApplicationTests : Started BlogApiApplicationTests in 1.84 seconds (JVM running for 2.462) +2025-04-17 09:39:43.499 INFO 5255 --- [main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting... +2025-04-17 09:39:43.996 INFO 5255 --- [main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed. +2025-04-17 09:39:44.000 DEBUG 5255 --- [main] c.m.m.C.getAllCategoriesWithLaws : ==> Preparing: SELECT c.category_id, c.name, c.description, l.law_id, l.category_id AS law_category_id, l.title, l.summary, l.content, l.effective_date, l.reference_url FROM categories c LEFT JOIN laws l ON c.category_id = l.category_id ORDER BY c.category_id, l.law_id +2025-04-17 09:39:44.009 DEBUG 5255 --- [main] c.m.m.C.getAllCategoriesWithLaws : ==> Parameters: +2025-04-17 09:39:44.078 DEBUG 5255 --- [main] c.m.m.C.getAllCategoriesWithLaws : <== Total: 5 +2025-04-17 09:39:44.088 INFO 5255 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED paused. +2025-04-17 09:39:44.088 INFO 5255 --- [SpringContextShutdownHook] o.s.s.quartz.SchedulerFactoryBean : Shutting down Quartz Scheduler +2025-04-17 09:39:44.089 INFO 5255 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED shutting down. +2025-04-17 09:39:44.089 INFO 5255 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED paused. +2025-04-17 09:39:44.089 INFO 5255 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED shutdown complete. +2025-04-17 09:39:44.089 INFO 5255 --- [SpringContextShutdownHook] o.s.s.concurrent.ThreadPoolTaskExecutor : Shutting down ExecutorService 'applicationTaskExecutor' +2025-04-17 09:39:44.098 INFO 5255 --- [SpringContextShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown initiated... +2025-04-17 09:39:44.102 INFO 5255 --- [SpringContextShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown completed. +2025-04-17 09:42:54.720 INFO 5460 --- [main] com.mingchen.BlogApiApplicationTests : Starting BlogApiApplicationTests on mingchendeMac-mini.local with PID 5460 (started by mingchen in /Users/mingchen/code/java/other/legalAid/api) +2025-04-17 09:42:54.722 DEBUG 5460 --- [main] com.mingchen.BlogApiApplicationTests : Running with Spring Boot v2.2.7.RELEASE, Spring v5.2.6.RELEASE +2025-04-17 09:42:54.722 INFO 5460 --- [main] com.mingchen.BlogApiApplicationTests : The following profiles are active: dev +2025-04-17 09:42:54.991 INFO 5460 --- [main] .s.d.r.c.RepositoryConfigurationDelegate : Multiple Spring Data modules found, entering strict repository configuration mode! +2025-04-17 09:42:54.993 INFO 5460 --- [main] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data Redis repositories in DEFAULT mode. +2025-04-17 09:42:55.011 INFO 5460 --- [main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 12ms. Found 0 Redis repository interfaces. +2025-04-17 09:42:55.355 ERROR 5460 --- [main] c.b.m.core.MybatisConfiguration : mapper[com.mingchen.mapper.CategoriesMapper.getAllCategoriesWithLaws] is ignored, because it exists, maybe from xml file diff --git a/api/pom.xml b/api/pom.xml new file mode 100644 index 0000000..1f65bdd --- /dev/null +++ b/api/pom.xml @@ -0,0 +1,202 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 2.2.7.RELEASE + + + com.mingchen + api + 0.0.1 + api + https://mingchen.com/ + API + + + 1.8 + 1.8 + 1.8 + UTF-8 + + + + + mingchen + common + 1.1-SNAPSHOT + + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-starter-security + + + + + com.baomidou + mybatis-plus-boot-starter + 3.4.3 + + + com.baomidou + mybatis-plus-core + 3.5.5 + + + com.baomidou + mybatis-plus-extension + 3.4.3 + + + + org.springframework.boot + spring-boot-starter-aop + + + + org.mybatis.spring.boot + mybatis-spring-boot-starter + 2.3.0 + + + + com.github.pagehelper + pagehelper-spring-boot-starter + 1.2.12 + + + + mysql + mysql-connector-java + runtime + + + + org.projectlombok + lombok + 1.18.20 + true + + + + io.jsonwebtoken + jjwt + 0.9.1 + + + + com.atlassian.commonmark + commonmark + 0.15.2 + + + com.atlassian.commonmark + commonmark-ext-heading-anchor + 0.15.2 + + + com.atlassian.commonmark + commonmark-ext-gfm-tables + 0.15.2 + + + com.atlassian.commonmark + commonmark-ext-gfm-strikethrough + 0.15.2 + + + com.atlassian.commonmark + commonmark-ext-task-list-items + 0.15.2 + + + + org.springframework.boot + spring-boot-starter-data-redis + + + + org.springframework.boot + spring-boot-starter-mail + + + + org.springframework.boot + spring-boot-starter-quartz + + + + org.lionsoul + ip2region + 1.7.2 + + + + nl.basjes.parse.useragent + yauaa + 5.20 + + + + + org.springframework.boot + spring-boot-devtools + runtime + true + + + org.springframework.boot + spring-boot-starter-test + test + + + org.junit.vintage + junit-vintage-engine + + + + + + + org.springframework.boot + spring-boot-starter-thymeleaf + + + javax.xml.bind + jaxb-api + 2.3.1 + + + org.glassfish.jaxb + jaxb-runtime + 2.3.1 + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + org.apache.maven.plugins + maven-compiler-plugin + + 9 + 9 + + + + + + diff --git a/api/src/main/java/com/mingchen/BlogApiApplication.java b/api/src/main/java/com/mingchen/BlogApiApplication.java new file mode 100644 index 0000000..5803c75 --- /dev/null +++ b/api/src/main/java/com/mingchen/BlogApiApplication.java @@ -0,0 +1,15 @@ +package com.mingchen; + +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +@MapperScan("com.mingchen.mapper") +public class BlogApiApplication { + + public static void main(String[] args) { + SpringApplication.run(BlogApiApplication.class, args); + } + +} diff --git a/api/src/main/java/com/mingchen/api/open/ApiController.java b/api/src/main/java/com/mingchen/api/open/ApiController.java new file mode 100644 index 0000000..fbf142f --- /dev/null +++ b/api/src/main/java/com/mingchen/api/open/ApiController.java @@ -0,0 +1,25 @@ +package com.mingchen.api.open; + +import com.mingchen.model.vo.Result; +import com.mingchen.service.impl.PlatformServiceImpl; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequestMapping("/admin/ai") +public class ApiController { + @Autowired + private PlatformServiceImpl platformService; + @PostMapping() + public Result getChat(@RequestParam String content) { + return platformService.getChat(content); + + } + + @GetMapping("/test") + public Result test(){ + return Result.ok("test"); + } + +} diff --git a/api/src/main/java/com/mingchen/api/open/CategoriesController.java b/api/src/main/java/com/mingchen/api/open/CategoriesController.java new file mode 100644 index 0000000..c82d17b --- /dev/null +++ b/api/src/main/java/com/mingchen/api/open/CategoriesController.java @@ -0,0 +1,30 @@ +package com.mingchen.api.open; + + +import com.mingchen.model.vo.Result; +import com.mingchen.service.ICategoriesService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; + +import org.springframework.web.bind.annotation.RestController; + +/** + *

+ * 前端控制器 + *

+ * + * @author mingchen + * @since 2025-04-17 + */ +@RestController +@RequestMapping("admin/categories") +public class CategoriesController { + @Autowired + private ICategoriesService categoriesService; + @GetMapping() + public Result getCategories(){ + return categoriesService.getCategories(); + } + +} diff --git a/api/src/main/java/com/mingchen/api/open/LawsController.java b/api/src/main/java/com/mingchen/api/open/LawsController.java new file mode 100644 index 0000000..8ad88f7 --- /dev/null +++ b/api/src/main/java/com/mingchen/api/open/LawsController.java @@ -0,0 +1,20 @@ +package com.mingchen.api.open; + + +import org.springframework.web.bind.annotation.RequestMapping; + +import org.springframework.web.bind.annotation.RestController; + +/** + *

+ * 前端控制器 + *

+ * + * @author mingchen + * @since 2025-04-17 + */ +@RestController +@RequestMapping("/laws") +public class LawsController { + +} diff --git a/api/src/main/java/com/mingchen/api/open/LearningResourcesController.java b/api/src/main/java/com/mingchen/api/open/LearningResourcesController.java new file mode 100644 index 0000000..4561fb7 --- /dev/null +++ b/api/src/main/java/com/mingchen/api/open/LearningResourcesController.java @@ -0,0 +1,33 @@ +package com.mingchen.api.open; + + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.mingchen.entity.LearningResources; +import com.mingchen.model.vo.Result; +import com.mingchen.service.ILearningResourcesService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; + +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +/** + *

+ * 前端控制器 + *

+ * + * @author mingchen + * @since 2025-04-17 + */ +@RestController +@RequestMapping("admin/learningResources") +public class LearningResourcesController { + @Autowired + private ILearningResourcesService learningResourcesService; + @GetMapping("/page") + public Result getLearningResources(@RequestParam(defaultValue = "1") int current, + @RequestParam(defaultValue = "10") int size){ + return learningResourcesService.getLearningResources(current, size); + } +} diff --git a/api/src/main/java/com/mingchen/api/open/LegalAidResourcesController.java b/api/src/main/java/com/mingchen/api/open/LegalAidResourcesController.java new file mode 100644 index 0000000..21cc520 --- /dev/null +++ b/api/src/main/java/com/mingchen/api/open/LegalAidResourcesController.java @@ -0,0 +1,35 @@ +package com.mingchen.api.open; + + +import com.mingchen.model.vo.Result; +import com.mingchen.service.ILegalAidResourcesService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; + +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +/** + *

+ * 前端控制器 + *

+ * + * @author mingchen + * @since 2025-04-17 + */ +@RestController +@RequestMapping("admin/legalAidResources") +public class LegalAidResourcesController { + @Autowired + private ILegalAidResourcesService legalAidResourcesService; + + @GetMapping("/page") + public Result getLegalAidResources(@RequestParam(defaultValue = "1") int current, + @RequestParam(defaultValue = "10") int size){ + + return legalAidResourcesService.getLegalAidResources(current,size); + + } + +} diff --git a/api/src/main/java/com/mingchen/api/open/LoginController.java b/api/src/main/java/com/mingchen/api/open/LoginController.java new file mode 100644 index 0000000..a54f55d --- /dev/null +++ b/api/src/main/java/com/mingchen/api/open/LoginController.java @@ -0,0 +1,50 @@ +package com.mingchen.api.open; + +import com.itmingchen.common.utils.JwtTool; +import com.mingchen.entity.User; +import com.mingchen.model.dto.LoginInfoDTO; +import com.mingchen.model.vo.Result; +import com.mingchen.service.UserService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; +import java.util.HashMap; +import java.util.Map; + +/** + * @Description: 前台登录 + * @Date: 2024-09-02 + */ +@RestController +@RequestMapping("/admin/login") +public class LoginController { + @Autowired + UserService userService; + @Resource + private JwtTool jwtTool; + + /** + * 登录成功后,签发博主身份Token + * + * @param loginInfoDTO + * @return + */ + @PostMapping() + public Result login(@RequestBody LoginInfoDTO loginInfoDTO) { +// User user = userService.findUserByUsernameAndPassword(loginInfoDTO.getUsername(), loginInfoDTO.getPassword()); +// if (!"ROLE_admin".equals(user.getRole())) { +// return Result.create(403, "无权限"); +// } + User user = userService.findUserByEmailAndPassword(loginInfoDTO); + user.setPassword(null); + String jwt = jwtTool.createToken(user.getUserId(), user.getEmail()); + Map map = new HashMap<>(); + map.put("user", user); + map.put("token", jwt); + return Result.ok("登录成功", map); + } +} diff --git a/api/src/main/java/com/mingchen/api/open/RegisterController.java b/api/src/main/java/com/mingchen/api/open/RegisterController.java new file mode 100644 index 0000000..48fe2bf --- /dev/null +++ b/api/src/main/java/com/mingchen/api/open/RegisterController.java @@ -0,0 +1,41 @@ +package com.mingchen.api.open; + +import com.mingchen.model.dto.RegisterReqDTO; +import com.mingchen.model.vo.Result; +import com.mingchen.service.RegisterService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +/** + * @ClassName RegisterController + * @Description: 注册 + * @Author: 3177583214@qq.com + */ +@RestController +@RequestMapping("/register") +public class RegisterController { + @Autowired + private RegisterService registerService; + + + /** + * 发送验证码 + * @param userEmail 邮箱 + */ + @PostMapping("/sendEmail") + public void send(@RequestParam String userEmail){ + registerService.send(userEmail); + } + + /** + * 注册 + * @param registerReqDTO 注册信息 + */ + @PostMapping() + public Result institutionRegister(@RequestBody RegisterReqDTO registerReqDTO) { + Result res = registerService.register(registerReqDTO); + return res; + } + + +} diff --git a/api/src/main/java/com/mingchen/api/open/UserController.java b/api/src/main/java/com/mingchen/api/open/UserController.java new file mode 100644 index 0000000..fdba105 --- /dev/null +++ b/api/src/main/java/com/mingchen/api/open/UserController.java @@ -0,0 +1,21 @@ +package com.mingchen.api.open; + +import com.mingchen.model.vo.Result; +import com.mingchen.service.UserService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/admin") +public class UserController { + @Autowired + UserService userService; + + + @GetMapping("/getUserInfo") + public Result getUserInfo(){ + return userService.getUserInfo(); + } +} \ No newline at end of file diff --git a/api/src/main/java/com/mingchen/api/sdk/AiService.java b/api/src/main/java/com/mingchen/api/sdk/AiService.java new file mode 100644 index 0000000..c3f82f0 --- /dev/null +++ b/api/src/main/java/com/mingchen/api/sdk/AiService.java @@ -0,0 +1,20 @@ +package com.mingchen.api.sdk; + +import cn.hutool.http.HttpRequest; +import cn.hutool.http.HttpResponse; +import cn.hutool.json.JSONUtil; +import com.mingchen.model.req.AiReq; +import com.mingchen.model.resp.AiResp; +import org.springframework.stereotype.Component; + +@Component +public class AiService { + public AiResp getChatApi(String url, String token,AiReq aiReq){ + HttpResponse resp = HttpRequest.post(url) + .header("Authorization","Bearer "+token) + .body(JSONUtil.toJsonStr(aiReq)) + .timeout(200000) + .execute(); + return JSONUtil.toBean(resp.body(), AiResp.class); + } +} diff --git a/api/src/main/java/com/mingchen/common/config/CustomAuthenticationProvider.java b/api/src/main/java/com/mingchen/common/config/CustomAuthenticationProvider.java new file mode 100644 index 0000000..9f37167 --- /dev/null +++ b/api/src/main/java/com/mingchen/common/config/CustomAuthenticationProvider.java @@ -0,0 +1,48 @@ +package com.mingchen.common.config; + +import com.itmingchen.common.expcetions.ErrorRequestException; +import com.itmingchen.common.utils.StringUtils; +import com.mingchen.service.impl.UserServiceImpl; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.authentication.AuthenticationProvider; +import org.springframework.security.authentication.BadCredentialsException; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.AuthenticationException; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.stereotype.Component; + +@Component +public class CustomAuthenticationProvider implements AuthenticationProvider { + + @Autowired + private UserServiceImpl userService; // UserDetailsService 的实现 + @Autowired + private PasswordEncoder passwordEncoder; // 密码编码器 + + @Override + public Authentication authenticate(Authentication authentication) throws AuthenticationException { + String email = authentication.getName(); // 提取用户名(电子邮件) + String password = authentication.getCredentials().toString(); // 提取密码 + + // 校验邮箱是否存在 + if(StringUtils.isEmpty(email)) throw new ErrorRequestException("请输入邮箱"); + // 校验密码是否存在 + if(StringUtils.isEmpty(password)) throw new ErrorRequestException("请输入密码"); + // 加载用户信息 + UserDetails userDetails = userService.loadUserByUsername(email); + + // 验证密码 + if (!passwordEncoder.matches(password, userDetails.getPassword())) { + throw new BadCredentialsException("密码错误,请重新输入"); + } + // 如果密码匹配,返回一个认证对象 + return new UsernamePasswordAuthenticationToken(userDetails, password, userDetails.getAuthorities()); + } + + @Override + public boolean supports(Class authentication) { + return UsernamePasswordAuthenticationToken.class.isAssignableFrom(authentication); + } +} diff --git a/api/src/main/java/com/mingchen/common/config/JwtFilter.java b/api/src/main/java/com/mingchen/common/config/JwtFilter.java new file mode 100644 index 0000000..c2439b6 --- /dev/null +++ b/api/src/main/java/com/mingchen/common/config/JwtFilter.java @@ -0,0 +1,70 @@ +package com.mingchen.common.config; + +import com.itmingchen.common.utils.JacksonUtils; +import com.itmingchen.common.utils.JwtTool; +import com.mingchen.model.vo.Result; +import io.jsonwebtoken.Claims; +import org.springframework.http.HttpMethod; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.authority.AuthorityUtils; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.web.filter.GenericFilterBean; + +import javax.servlet.FilterChain; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.io.PrintWriter; +import java.util.List; +import java.util.Set; + +/** + * @Description: JWT请求过滤器 + * @Date: 2024-07-21 + */ +public class JwtFilter extends GenericFilterBean { + + // 定义放行的路径和对应方法 + private static final Set PERMIT_PATHS = Set.of( + "/register", // POST + "register/sendEmail" // POST + ); + @Override + public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { + HttpServletRequest request = (HttpServletRequest) servletRequest; + HttpServletResponse response = (HttpServletResponse) servletResponse; + //后台管理路径外的请求直接跳过 + String path = request.getServletPath(); + HttpMethod method = HttpMethod.resolve(request.getMethod()); + + // 统一判断路径和方法是否放行 + if (PERMIT_PATHS.contains(path) && HttpMethod.POST == method) { + filterChain.doFilter(request, response); + return; + } + String jwt = request.getHeader("Authorization"); + if (JwtTool.judgeTokenIsExist(jwt)) { + try { + Claims claims = JwtTool.getTokenBody(jwt); + String email = claims.getSubject(); + List authorities = AuthorityUtils.commaSeparatedStringToAuthorityList((String) claims.get("authorities")); + UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(email, null, authorities); + SecurityContextHolder.getContext().setAuthentication(token); + } catch (Exception e) { + e.printStackTrace(); + response.setContentType("application/json;charset=utf-8"); + Result result = Result.create(403, "凭证已失效,请重新登录!"); + PrintWriter out = response.getWriter(); + out.write(JacksonUtils.writeValueAsString(result)); + out.flush(); + out.close(); + return; + } + } + filterChain.doFilter(servletRequest, servletResponse); + } +} \ No newline at end of file diff --git a/api/src/main/java/com/mingchen/common/config/JwtLoginFilter.java b/api/src/main/java/com/mingchen/common/config/JwtLoginFilter.java new file mode 100644 index 0000000..3a6b162 --- /dev/null +++ b/api/src/main/java/com/mingchen/common/config/JwtLoginFilter.java @@ -0,0 +1,102 @@ +package com.mingchen.common.config; + +import com.itmingchen.common.expcetions.ErrorRequestException; +import com.itmingchen.common.utils.JacksonUtils; +import com.itmingchen.common.utils.JwtTool; +import com.mingchen.entity.User; +import com.mingchen.model.vo.Result; +import com.mingchen.service.LoginLogService; +import org.springframework.security.authentication.*; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.AuthenticationException; +import org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter; +import org.springframework.security.web.util.matcher.AntPathRequestMatcher; + +import javax.servlet.FilterChain; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.io.PrintWriter; +import java.util.HashMap; +import java.util.Map; + +/** + * @Description: JWT登录过滤器 + * @Date: 2024-07-21 + */ +public class JwtLoginFilter extends AbstractAuthenticationProcessingFilter { + LoginLogService loginLogService; + ThreadLocal currentUsername = new ThreadLocal<>(); + + // 可以在这里进行增加配置管理 如进行用户登陆信息初始化 + protected JwtLoginFilter(String defaultFilterProcessesUrl, AuthenticationManager authenticationManager, LoginLogService loginLogService) { + super(new AntPathRequestMatcher(defaultFilterProcessesUrl)); + setAuthenticationManager(authenticationManager); + this.loginLogService = loginLogService; + } + + @Override + public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) + throws AuthenticationException, IOException { + try { + if (!"POST".equals(request.getMethod())) { + throw new ErrorRequestException("请求方法错误"); + + } + User user = JacksonUtils.readValue(request.getInputStream(), User.class); + currentUsername.set(user.getEmail()); + + return getAuthenticationManager().authenticate(new UsernamePasswordAuthenticationToken(user.getEmail(), user.getPassword())); + } catch (ErrorRequestException exception) { + response.setContentType("application/json;charset=utf-8"); + Result result = Result.create(400, "非法请求"); + PrintWriter out = response.getWriter(); + out.write(JacksonUtils.writeValueAsString(result)); + out.flush(); + out.close(); + } + return null; + } + + @Override + protected void successfulAuthentication(HttpServletRequest request, HttpServletResponse response, + FilterChain chain, Authentication authResult) throws IOException { + + // 更换验证方式 只在具体实现类更改逻辑 更符合编码设计 + String jwt = JwtTool.generateToken(authResult.getName(), authResult.getAuthorities()); + response.setContentType("application/json;charset=utf-8"); + User user = (User) authResult.getPrincipal(); + user.setPassword(null); + Map map = new HashMap<>(); + map.put("user", user); + map.put("token", jwt); + Result result = Result.ok("登录成功", map); + PrintWriter out = response.getWriter(); + out.write(JacksonUtils.writeValueAsString(result)); + out.flush(); + out.close(); + } + + @Override + protected void unsuccessfulAuthentication(HttpServletRequest request, HttpServletResponse response, + AuthenticationException exception) throws IOException { + response.setContentType("application/json;charset=utf-8"); + String msg = exception.getMessage(); + //登录不成功时,会抛出对应的异常 + if (exception instanceof LockedException) { + msg = "账号被锁定"; + } else if (exception instanceof CredentialsExpiredException) { + msg = "密码过期"; + } else if (exception instanceof AccountExpiredException) { + msg = "账号过期"; + } else if (exception instanceof DisabledException) { + msg = "账号被禁用"; + } else if (exception instanceof BadCredentialsException) { + msg = "用户名或密码错误"; + } + PrintWriter out = response.getWriter(); + out.write(JacksonUtils.writeValueAsString(Result.create(401, msg))); + out.flush(); + out.close(); + } +} \ No newline at end of file diff --git a/api/src/main/java/com/mingchen/common/config/MyAuthenticationEntryPoint.java b/api/src/main/java/com/mingchen/common/config/MyAuthenticationEntryPoint.java new file mode 100644 index 0000000..e4e466f --- /dev/null +++ b/api/src/main/java/com/mingchen/common/config/MyAuthenticationEntryPoint.java @@ -0,0 +1,31 @@ +package com.mingchen.common.config; + +import com.mingchen.model.vo.Result; +import org.springframework.security.core.AuthenticationException; +import org.springframework.security.web.AuthenticationEntryPoint; +import org.springframework.stereotype.Component; +import com.itmingchen.common.utils.JacksonUtils; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.io.PrintWriter; + +/** + * @Description: 未登录 拒绝访问 + * @Date: 2024-07-21 + */ +@Component +public class MyAuthenticationEntryPoint implements AuthenticationEntryPoint { + @Override + public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException exception) + throws IOException, ServletException { + response.setContentType("application/json;charset=utf-8"); + PrintWriter out = response.getWriter(); + Result result = Result.create(403, "请登录"); + out.write(JacksonUtils.writeValueAsString(result)); + out.flush(); + out.close(); + } +} diff --git a/api/src/main/java/com/mingchen/common/config/SecurityConfig.java b/api/src/main/java/com/mingchen/common/config/SecurityConfig.java new file mode 100644 index 0000000..e7033af --- /dev/null +++ b/api/src/main/java/com/mingchen/common/config/SecurityConfig.java @@ -0,0 +1,59 @@ +package com.mingchen.common.config; + +import com.mingchen.service.LoginLogService; +import com.mingchen.service.impl.UserServiceImpl; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Configuration; +import org.springframework.http.HttpMethod; +import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; +import org.springframework.security.config.http.SessionCreationPolicy; +import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; + +/** + * @Description: Spring Security配置类 + * @Date: 2024-07-19 + */ +@Configuration +public class SecurityConfig extends WebSecurityConfigurerAdapter { + @Autowired + UserServiceImpl userService; + @Autowired + LoginLogService loginLogService; + @Autowired + MyAuthenticationEntryPoint myAuthenticationEntryPoint; + @Autowired + private CustomAuthenticationProvider customAuthenticationProvider; + + + + @Override + protected void configure(AuthenticationManagerBuilder auth) throws Exception { + auth.authenticationProvider(customAuthenticationProvider); // 使用自定义的 AuthenticationProvider + } + @Override + protected void configure(HttpSecurity http) throws Exception { + http + //禁用 csrf 防御 + .csrf().disable() + //开启跨域支持 + .cors().and() + //基于Token,不创建会话 + .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and() + .authorizeRequests() + //放行获取网页标题后缀的请求 + .antMatchers("/admin/webTitleSuffix").permitAll() + //任何 /admin 开头的路径下的请求都需要经过JWT验证 + .antMatchers(HttpMethod.GET, "/admin/**").hasAnyRole("admin", "visitor") + .antMatchers("/admin/**").hasRole("admin") + //其它路径全部放行 + .anyRequest().permitAll() + .and() + //自定义JWT过滤器 + .addFilterBefore(new JwtLoginFilter("/admin/login", authenticationManager(), loginLogService), UsernamePasswordAuthenticationFilter.class) + .addFilterBefore(new JwtFilter(), UsernamePasswordAuthenticationFilter.class) + //未登录时,返回json,在前端执行重定向 + .exceptionHandling().authenticationEntryPoint(myAuthenticationEntryPoint); + } +} diff --git a/api/src/main/java/com/mingchen/common/config/WebConfig.java b/api/src/main/java/com/mingchen/common/config/WebConfig.java new file mode 100644 index 0000000..1116ded --- /dev/null +++ b/api/src/main/java/com/mingchen/common/config/WebConfig.java @@ -0,0 +1,38 @@ +package com.mingchen.common.config; + +import com.mingchen.common.interceptor.AccessLimitInterceptor; +import com.mingchen.common.interceptor.UserContextInterceptor; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.CorsRegistry; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +/** + * @Description: CORS跨域支持 + * @Date: 2024-07-22 + */ + +@Configuration +public class WebConfig implements WebMvcConfigurer { + + @Autowired + AccessLimitInterceptor accessLimitInterceptor; + @Autowired + UserContextInterceptor userContextInterceptor; + + @Override + public void addCorsMappings(CorsRegistry registry) { + registry.addMapping("/**") + .allowedOrigins("*") + .allowedHeaders("*") + .allowedMethods("GET", "POST", "PUT", "DELETE", "HEAD", "OPTIONS") + .maxAge(3600); + } + + @Override + public void addInterceptors(InterceptorRegistry registry) { + registry.addInterceptor(accessLimitInterceptor); + registry.addInterceptor(userContextInterceptor); + } +} diff --git a/api/src/main/java/com/mingchen/common/config/configuration/BeanConfiguration.java b/api/src/main/java/com/mingchen/common/config/configuration/BeanConfiguration.java new file mode 100644 index 0000000..bc2c839 --- /dev/null +++ b/api/src/main/java/com/mingchen/common/config/configuration/BeanConfiguration.java @@ -0,0 +1,68 @@ +package com.mingchen.common.config.configuration; + +import com.itmingchen.common.utils.*; +import com.mingchen.common.properties.ApplicationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; + +import javax.annotation.Resource; + +@Configuration +public class BeanConfiguration { + + @Resource + private ApplicationProperties applicationProperties; + + + @Bean + public RedisUtils RedisUtils() { + return new RedisUtils(); + } + + @Bean + public RedisUtil RedisUtil() { + return new RedisUtil(); + } + + @Bean + public MailUtils MailUtils() { + return new MailUtils(); + } + + + @Bean + public HashUtils HashUtils() { + return new HashUtils(); + } + + + + @Bean + public IpAddressUtils IpAddressUtils() { + return new IpAddressUtils(); + } + + @Bean + public JacksonUtils JacksonUtils() { + return new JacksonUtils(); + } + + + @Bean + public JwtTool jwtTool() { + return new JwtTool(applicationProperties.getJwtKey()); + } + + @Bean + public UserAgentUtils UserAgentUtils() { + return new UserAgentUtils(); + } + + + @Bean + public BCryptPasswordEncoder bCryptPasswordEncoder() { + return new BCryptPasswordEncoder(); + } + +} \ No newline at end of file diff --git a/api/src/main/java/com/mingchen/common/config/configuration/MyBatisConfig.java b/api/src/main/java/com/mingchen/common/config/configuration/MyBatisConfig.java new file mode 100644 index 0000000..0ec950d --- /dev/null +++ b/api/src/main/java/com/mingchen/common/config/configuration/MyBatisConfig.java @@ -0,0 +1,22 @@ +package com.mingchen.common.config.configuration; + +import com.github.pagehelper.PageHelper; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import java.util.Properties; + +@Configuration +public class MyBatisConfig { + // 设置相关的参数信息,下面有对参数的详细解释 + @Bean + public PageHelper pageHelper() { + PageHelper pageHelper = new PageHelper(); + Properties properties = new Properties(); + properties.setProperty("dialect", "Mysql"); + properties.setProperty("offsetAsPageNum", "true"); + properties.setProperty("rowBoundsWithCount", "true"); + pageHelper.setProperties(properties); + return pageHelper; + } +} diff --git a/api/src/main/java/com/mingchen/common/config/configuration/RedisConfig.java b/api/src/main/java/com/mingchen/common/config/configuration/RedisConfig.java new file mode 100644 index 0000000..ca89e67 --- /dev/null +++ b/api/src/main/java/com/mingchen/common/config/configuration/RedisConfig.java @@ -0,0 +1,33 @@ +package com.mingchen.common.config.configuration; + +import com.fasterxml.jackson.databind.ObjectMapper; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.data.redis.connection.RedisConnectionFactory; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer; +import org.springframework.data.redis.serializer.StringRedisSerializer; + +@Configuration +public class RedisConfig { + + @Bean + public RedisTemplate redisTemplate(RedisConnectionFactory connectionFactory){ + RedisTemplate template = new RedisTemplate<>(); + template.setConnectionFactory(connectionFactory); + + // 使用 Jackson2JsonRedisSerializer 替换默认序列化 + Jackson2JsonRedisSerializer serializer = new Jackson2JsonRedisSerializer<>(Object.class); + ObjectMapper mapper = new ObjectMapper(); + serializer.setObjectMapper(mapper); + + // 设置 key 和 value 的序列化器 + template.setKeySerializer(new StringRedisSerializer()); + template.setValueSerializer(serializer); + template.setHashKeySerializer(new StringRedisSerializer()); + template.setHashValueSerializer(serializer); + + template.afterPropertiesSet(); + return template; + } +} diff --git a/api/src/main/java/com/mingchen/common/config/configuration/RedisSerializeConfig.java b/api/src/main/java/com/mingchen/common/config/configuration/RedisSerializeConfig.java new file mode 100644 index 0000000..51223dc --- /dev/null +++ b/api/src/main/java/com/mingchen/common/config/configuration/RedisSerializeConfig.java @@ -0,0 +1,30 @@ +package com.mingchen.common.config.configuration; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.data.redis.connection.RedisConnectionFactory; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer; + +/** + * @Description: Redis序列化配置 + * @Date: 2024-09-27 + */ +@Configuration +public class RedisSerializeConfig { + + /** + * 使用JSON序列化方式 + * + * @param redisConnectionFactory + * @return + */ + @Bean + public RedisTemplate jsonRedisTemplate(RedisConnectionFactory redisConnectionFactory) { + RedisTemplate template = new RedisTemplate<>(); + template.setConnectionFactory(redisConnectionFactory); + Jackson2JsonRedisSerializer serializer = new Jackson2JsonRedisSerializer(Object.class); + template.setDefaultSerializer(serializer); + return template; + } +} diff --git a/api/src/main/java/com/mingchen/common/constant/RedisConstants.java b/api/src/main/java/com/mingchen/common/constant/RedisConstants.java new file mode 100644 index 0000000..103b80f --- /dev/null +++ b/api/src/main/java/com/mingchen/common/constant/RedisConstants.java @@ -0,0 +1,17 @@ +package com.mingchen.common.constant; + +/** + * redis相关常量 + * + * @author itcast + * @create 2023/8/15 14:58 + **/ +public class RedisConstants { + + + //分类名列表key + public static final String EMAIL_CODE_MAP = "emailCodeMap"; + + + +} diff --git a/api/src/main/java/com/mingchen/common/handler/ControllerExceptionHandler.java b/api/src/main/java/com/mingchen/common/handler/ControllerExceptionHandler.java new file mode 100644 index 0000000..39e763e --- /dev/null +++ b/api/src/main/java/com/mingchen/common/handler/ControllerExceptionHandler.java @@ -0,0 +1,74 @@ +package com.mingchen.common.handler; + +import com.itmingchen.common.expcetions.NotFoundException; +import com.itmingchen.common.expcetions.PersistenceException; +import com.mingchen.model.vo.Result; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.security.core.userdetails.UsernameNotFoundException; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.RestControllerAdvice; + +import javax.servlet.http.HttpServletRequest; + +/** + * @Description: 对Controller层全局异常处理 + * @RestControllerAdvice 捕获异常后,返回json数据类型 + * @Date: 2024-08-14 + */ +@RestControllerAdvice +public class ControllerExceptionHandler { + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + + /** + * 捕获自定义的404异常 + * + * @param request 请求 + * @param e 自定义抛出的异常信息 + * @return + */ + @ExceptionHandler(NotFoundException.class) + public Result notFoundExceptionHandler(HttpServletRequest request, NotFoundException e) { + logger.error("Request URL : {}, Exception :", request.getRequestURL(), e); + return Result.create(404, e.getMessage()); + } + + /** + * 捕获自定义的持久化异常 + * + * @param request 请求 + * @param e 自定义抛出的异常信息 + * @return + */ + @ExceptionHandler(PersistenceException.class) + public Result persistenceExceptionHandler(HttpServletRequest request, PersistenceException e) { + logger.error("Request URL : {}, Exception :", request.getRequestURL(), e); + return Result.create(500, e.getMessage()); + } + + /** + * 捕获自定义的登录失败异常 + * + * @param request 请求 + * @param e 自定义抛出的异常信息 + * @return + */ + @ExceptionHandler(UsernameNotFoundException.class) + public Result usernameNotFoundExceptionHandler(HttpServletRequest request, UsernameNotFoundException e) { + logger.error("Request URL : {}, Exception :", request.getRequestURL(), e); + return Result.create(401, "用户名或密码错误!"); + } + + /** + * 捕获其它异常 + * + * @param request 请求 + * @param e 异常信息 + * @return + */ + @ExceptionHandler(Exception.class) + public Result exceptionHandler(HttpServletRequest request, Exception e) { + logger.error("Request URL : {}, Exception :", request.getRequestURL(), e); + return Result.create(500, e.getMessage()); + } +} diff --git a/api/src/main/java/com/mingchen/common/interceptor/AccessLimit.java b/api/src/main/java/com/mingchen/common/interceptor/AccessLimit.java new file mode 100644 index 0000000..d0b3f4c --- /dev/null +++ b/api/src/main/java/com/mingchen/common/interceptor/AccessLimit.java @@ -0,0 +1,29 @@ +package com.mingchen.common.interceptor; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * @Description: 访问控制 + * @Date: 2024-04-04 + */ +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +public @interface AccessLimit { + /** + * 限制周期(秒) + */ + int seconds(); + + /** + * 规定周期内限制次数 + */ + int maxCount(); + + /** + * 触发限制时的消息提示 + */ + String msg() default "操作频率过高"; +} \ No newline at end of file diff --git a/api/src/main/java/com/mingchen/common/interceptor/AccessLimitInterceptor.java b/api/src/main/java/com/mingchen/common/interceptor/AccessLimitInterceptor.java new file mode 100644 index 0000000..a23a008 --- /dev/null +++ b/api/src/main/java/com/mingchen/common/interceptor/AccessLimitInterceptor.java @@ -0,0 +1,25 @@ +package com.mingchen.common.interceptor; + + +import org.springframework.stereotype.Component; +import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + + +/** + * @Description: 访问控制拦截器 + * @Author: mingchen + * @Date: 2024-04-04 + */ +@Component +public class AccessLimitInterceptor extends HandlerInterceptorAdapter { + + + + + @Override + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { + return true; + } +} \ No newline at end of file diff --git a/api/src/main/java/com/mingchen/common/interceptor/UserContextInterceptor.java b/api/src/main/java/com/mingchen/common/interceptor/UserContextInterceptor.java new file mode 100644 index 0000000..de52f66 --- /dev/null +++ b/api/src/main/java/com/mingchen/common/interceptor/UserContextInterceptor.java @@ -0,0 +1,55 @@ +package com.mingchen.common.interceptor; + +import com.itmingchen.common.model.CurrentUserInfo; +import com.itmingchen.common.utils.JwtTool; +import com.mingchen.entity.User; +import com.mingchen.entity.UserContext; +import com.mingchen.service.impl.UserServiceImpl; +import io.jsonwebtoken.Claims; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.stereotype.Component; +import org.springframework.web.servlet.HandlerInterceptor; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +@Component +public class UserContextInterceptor implements HandlerInterceptor { + @Autowired + private UserServiceImpl userService; + @Override + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) { + + + String jwt = request.getHeader("Authorization"); + if (JwtTool.judgeTokenIsExist(jwt)) { + try { + // 解析 token + Claims claims = JwtTool.getTokenBody(jwt); + // 拿到 token 中的 email + String email = claims.getSubject(); + // TODO 后续会改变从数据库获取用户信息的方式 + // 调用方法获取用户信息 + UserDetails userDetails = userService.loadUserByUsername(email); + User user = (User) userDetails; + // 将用户相关信息存入 ThreadLocal + CurrentUserInfo currentUserInfo = new CurrentUserInfo(); + // 设置 email + currentUserInfo.setEmail(email); + // 设置用户ID + currentUserInfo.setId(user.getUserId()); + UserContext.set(currentUserInfo); + }catch (Exception e){ + e.printStackTrace(); + } + } + return true; + } + + @Override + public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) { + // 必须清理ThreadLocal + UserContext.clear(); + } +} diff --git a/api/src/main/java/com/mingchen/common/properties/ApplicationProperties.java b/api/src/main/java/com/mingchen/common/properties/ApplicationProperties.java new file mode 100644 index 0000000..a50cc25 --- /dev/null +++ b/api/src/main/java/com/mingchen/common/properties/ApplicationProperties.java @@ -0,0 +1,16 @@ +package com.mingchen.common.properties; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Configuration; + +/** + * @author itcast + */ +@ConfigurationProperties(prefix = "mingchen") +@Configuration +@Data +public class ApplicationProperties { + + private String jwtKey; +} diff --git a/api/src/main/java/com/mingchen/entity/Categories.java b/api/src/main/java/com/mingchen/entity/Categories.java new file mode 100644 index 0000000..0449813 --- /dev/null +++ b/api/src/main/java/com/mingchen/entity/Categories.java @@ -0,0 +1,44 @@ +package com.mingchen.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import java.io.Serializable; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + *

+ * + *

+ * + * @author mingchen + * @since 2025-04-17 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("categories") +public class Categories implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 类别唯一标识(主键) + */ + @TableId(value = "category_id", type = IdType.AUTO) + private Integer categoryId; + + /** + * 类别名称(如“财产”、“婚姻”、“继承”) + */ + private String name; + + /** + * 类别简要说明 + */ + private String description; + + +} diff --git a/api/src/main/java/com/mingchen/entity/CurrentUserInfo.java b/api/src/main/java/com/mingchen/entity/CurrentUserInfo.java new file mode 100644 index 0000000..f89921f --- /dev/null +++ b/api/src/main/java/com/mingchen/entity/CurrentUserInfo.java @@ -0,0 +1,28 @@ +package com.mingchen.entity; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; + +import java.io.Serializable; + +/** + * 当前用户信息 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +@Accessors(chain = true) +public class CurrentUserInfo implements Serializable { + + /** + * 当前用户id + */ + private Long id; + /** + * 当前用户id + */ + private String email; + +} diff --git a/api/src/main/java/com/mingchen/entity/Laws.java b/api/src/main/java/com/mingchen/entity/Laws.java new file mode 100644 index 0000000..e972a80 --- /dev/null +++ b/api/src/main/java/com/mingchen/entity/Laws.java @@ -0,0 +1,65 @@ +package com.mingchen.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.IdType; +import java.time.LocalDate; +import com.baomidou.mybatisplus.annotation.TableId; +import java.io.Serializable; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + *

+ * + *

+ * + * @author mingchen + * @since 2025-04-17 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("laws") +public class Laws implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 法律法规唯一标识(主键) + */ + @TableId(value = "law_id", type = IdType.AUTO) + private Integer lawId; + + /** + * 关联法律类别(外键引用 Categories.category_id) + */ + private Integer categoryId; + + /** + * 法律标题(如《婚姻法》第XX条) + */ + private String title; + + /** + * 法律条款摘要(面向老年人简化表述) + */ + private String summary; + + /** + * 法律条款全文 + */ + private String content; + + /** + * 生效日期 + */ + private LocalDate effectiveDate; + + /** + * 官方参考链接(用于权威性验证) + */ + private String referenceUrl; + + +} diff --git a/api/src/main/java/com/mingchen/entity/LearningResources.java b/api/src/main/java/com/mingchen/entity/LearningResources.java new file mode 100644 index 0000000..bbde7f4 --- /dev/null +++ b/api/src/main/java/com/mingchen/entity/LearningResources.java @@ -0,0 +1,59 @@ +package com.mingchen.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import java.io.Serializable; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + *

+ * + *

+ * + * @author mingchen + * @since 2025-04-17 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("learning_resources") +public class LearningResources implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 学习资源唯一标识(主键) + */ + @TableId(value = "resource_id", type = IdType.AUTO) + private Integer resourceId; + + /** + * 课程标题(如“婚姻法解读”) + */ + private String title; + + /** + * 资源类型(可选值:视频、音频) + */ + private String type; + + /** + * 视频/音频文件链接或存储路径 + */ + private String url; + + /** + * 时长(如“5分钟”) + */ + private String duration; + + /** + * 课程内容简介 + */ + private String description; + + +} diff --git a/api/src/main/java/com/mingchen/entity/LegalAidResources.java b/api/src/main/java/com/mingchen/entity/LegalAidResources.java new file mode 100644 index 0000000..f29e9b3 --- /dev/null +++ b/api/src/main/java/com/mingchen/entity/LegalAidResources.java @@ -0,0 +1,78 @@ +package com.mingchen.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import java.io.Serializable; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + *

+ * + *

+ * + * @author mingchen + * @since 2025-04-17 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("legalAidResources") +public class LegalAidResources implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 法律援助资源唯一标识(主键) + */ + @TableId(value = "aid_id", type = IdType.AUTO) + private Integer aidId; + + /** + * 机构/律师名称 + */ + private String name; + + /** + * 资源类型(可选值:律师、机构) + */ + private String type; + + /** + * 联系电话 + */ + private String phoneNumber; + + /** + * 邮箱(可选) + */ + private String email; + /** + * 邮箱(可选) + */ + private String avatar; + + /** + * 办公地址 + */ + private String address; + + /** + * 官方网站链接(可选) + */ + private String websiteUrl; + + /** + * 是否紧急求助(用于“一键拨打”) + */ + private Boolean isEmergency; + + /** + * 服务范围说明 + */ + private String description; + + +} diff --git a/api/src/main/java/com/mingchen/entity/User.java b/api/src/main/java/com/mingchen/entity/User.java new file mode 100644 index 0000000..eae6c4a --- /dev/null +++ b/api/src/main/java/com/mingchen/entity/User.java @@ -0,0 +1,115 @@ +package com.mingchen.entity; + + +import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.annotation.JsonIgnore; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.authority.SimpleGrantedAuthority; +import org.springframework.security.core.userdetails.UserDetails; + +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +/** + *

+ * + * @author mingchen + * @since 2025-03-05 + */ + +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("user") +public class User implements Serializable , UserDetails { + private static final long serialVersionUID = 1L; + + @TableId(value = "user_id", type = IdType.AUTO) + private Long userId; + + /** + * 用户名 + */ + private String username; + + /** + * 密码 + */ + private String password; + + + /** + * 头像地址 + */ + private String avatar; + + /** + * 邮箱 + */ + private String email; + + /** + * 创建时间 + */ + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** + * 更新时间 + */ + @TableField(fill = FieldFill.INSERT_UPDATE) + private LocalDateTime updateTime; + + /** + * 角色访问权限 + */ + private String role; + /** + * IP地址 + */ + private String ip; + + /** + * 地址 + */ + private String address; + + + @JsonIgnore + @Override + public Collection getAuthorities() { + List authorityList = new ArrayList<>(); + authorityList.add(new SimpleGrantedAuthority(role)); + return authorityList; + } + + @JsonIgnore + @Override + public boolean isAccountNonExpired() { + return true; + } + + @JsonIgnore + @Override + public boolean isAccountNonLocked() { + return true; + } + + @JsonIgnore + @Override + public boolean isCredentialsNonExpired() { + return true; + } + + @JsonIgnore + @Override + public boolean isEnabled() { + return true; + } +} diff --git a/api/src/main/java/com/mingchen/entity/UserContext.java b/api/src/main/java/com/mingchen/entity/UserContext.java new file mode 100644 index 0000000..de8269e --- /dev/null +++ b/api/src/main/java/com/mingchen/entity/UserContext.java @@ -0,0 +1,42 @@ +package com.mingchen.entity; + +import com.itmingchen.common.model.CurrentUserInfo; + +/** + * 用户信息上下文,主要存储用户id + * + * @author itcast + */ +public class UserContext { + private static final ThreadLocal THREAD_LOCAL_USER = new ThreadLocal<>(); + + + /** + * 获取当前用户id + * + * @return 用户id + */ + public static String currentUserEmail() { + return THREAD_LOCAL_USER.get().getEmail(); + } + + public static CurrentUserInfo currentUser() { + return THREAD_LOCAL_USER.get(); + } + + /** + * 设置当前用户id + * + * @param currentUserInfo 当前用户信息 + */ + public static void set(CurrentUserInfo currentUserInfo) { + THREAD_LOCAL_USER.set(currentUserInfo); + } + + /** + * 清理当前线程中的用户信息 + */ + public static void clear(){ + THREAD_LOCAL_USER.remove(); + } +} diff --git a/api/src/main/java/com/mingchen/mapper/CategoriesMapper.java b/api/src/main/java/com/mingchen/mapper/CategoriesMapper.java new file mode 100644 index 0000000..619b50c --- /dev/null +++ b/api/src/main/java/com/mingchen/mapper/CategoriesMapper.java @@ -0,0 +1,26 @@ +package com.mingchen.mapper; + +import com.mingchen.entity.Categories; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.mingchen.model.dto.CategoryWithLaws; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Select; +import org.springframework.stereotype.Repository; + +import java.util.List; + +/** + *

+ * Mapper 接口 + *

+ * + * @author mingchen + * @since 2025-04-17 + */ +@Mapper +@Repository +public interface CategoriesMapper extends BaseMapper { +// @Select("SELECT c.category_id, c.name, c.description, l.law_id, l.category_id AS law_category_id, l.title, l.summary, l.content, l.effective_date, l.reference_url " + +// "FROM categories c LEFT JOIN laws l ON c.category_id = l.category_id ORDER BY c.category_id, l.law_id") + List getAllCategoriesWithLaws(); +} diff --git a/api/src/main/java/com/mingchen/mapper/LawsMapper.java b/api/src/main/java/com/mingchen/mapper/LawsMapper.java new file mode 100644 index 0000000..1536f5f --- /dev/null +++ b/api/src/main/java/com/mingchen/mapper/LawsMapper.java @@ -0,0 +1,16 @@ +package com.mingchen.mapper; + +import com.mingchen.entity.Laws; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * Mapper 接口 + *

+ * + * @author mingchen + * @since 2025-04-17 + */ +public interface LawsMapper extends BaseMapper { + +} diff --git a/api/src/main/java/com/mingchen/mapper/LearningResourcesMapper.java b/api/src/main/java/com/mingchen/mapper/LearningResourcesMapper.java new file mode 100644 index 0000000..862c76f --- /dev/null +++ b/api/src/main/java/com/mingchen/mapper/LearningResourcesMapper.java @@ -0,0 +1,16 @@ +package com.mingchen.mapper; + +import com.mingchen.entity.LearningResources; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * Mapper 接口 + *

+ * + * @author mingchen + * @since 2025-04-17 + */ +public interface LearningResourcesMapper extends BaseMapper { + +} diff --git a/api/src/main/java/com/mingchen/mapper/LegalAidResourcesMapper.java b/api/src/main/java/com/mingchen/mapper/LegalAidResourcesMapper.java new file mode 100644 index 0000000..7ba30e5 --- /dev/null +++ b/api/src/main/java/com/mingchen/mapper/LegalAidResourcesMapper.java @@ -0,0 +1,16 @@ +package com.mingchen.mapper; + +import com.mingchen.entity.LegalAidResources; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * Mapper 接口 + *

+ * + * @author mingchen + * @since 2025-04-17 + */ +public interface LegalAidResourcesMapper extends BaseMapper { + +} diff --git a/api/src/main/java/com/mingchen/mapper/LoginLogMapper.java b/api/src/main/java/com/mingchen/mapper/LoginLogMapper.java new file mode 100644 index 0000000..c33659c --- /dev/null +++ b/api/src/main/java/com/mingchen/mapper/LoginLogMapper.java @@ -0,0 +1,16 @@ +package com.mingchen.mapper; + +import org.apache.ibatis.annotations.Mapper; +import org.springframework.stereotype.Repository; + +/** + * @Description: 登录日志持久层接口 + * @Date: 2024-12-03 + */ +@Mapper +@Repository +public interface LoginLogMapper { + + + int deleteLoginLogById(Long id); +} diff --git a/api/src/main/java/com/mingchen/mapper/RegisterMapper.java b/api/src/main/java/com/mingchen/mapper/RegisterMapper.java new file mode 100644 index 0000000..cb7c205 --- /dev/null +++ b/api/src/main/java/com/mingchen/mapper/RegisterMapper.java @@ -0,0 +1,12 @@ +package com.mingchen.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.mingchen.entity.User; +import org.apache.ibatis.annotations.Mapper; +import org.springframework.stereotype.Repository; + +@Mapper +@Repository +public interface RegisterMapper extends BaseMapper { + +} \ No newline at end of file diff --git a/api/src/main/java/com/mingchen/mapper/UserMapper.java b/api/src/main/java/com/mingchen/mapper/UserMapper.java new file mode 100644 index 0000000..2defcbc --- /dev/null +++ b/api/src/main/java/com/mingchen/mapper/UserMapper.java @@ -0,0 +1,18 @@ +package com.mingchen.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.mingchen.entity.User; +import org.apache.ibatis.annotations.Mapper; +import org.springframework.stereotype.Repository; + +/** + * @Description: 用户持久层接口 + * @Date: 2024-07-19 + */ +@Mapper +@Repository +public interface UserMapper extends BaseMapper { + User findByUsername(String username); + + +} diff --git a/api/src/main/java/com/mingchen/model/dto/CategoryWithLaws.java b/api/src/main/java/com/mingchen/model/dto/CategoryWithLaws.java new file mode 100644 index 0000000..6c44e75 --- /dev/null +++ b/api/src/main/java/com/mingchen/model/dto/CategoryWithLaws.java @@ -0,0 +1,98 @@ +package com.mingchen.model.dto; + +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableField; +import java.time.LocalDate; +import java.util.List; +import java.io.Serializable; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + *

+ * 合并的实体类,包含法律类别和相关法律法规 + *

+ * + * @author + * @since 2025-04-17 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("categories") +public class CategoryWithLaws implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 类别唯一标识(主键) + */ + @TableId(value = "category_id", type = IdType.AUTO) + private Integer categoryId; + + /** + * 类别名称(如“财产”、“婚姻”、“继承”) + */ + private String name; + + /** + * 类别简要说明 + */ + private String description; + + /** + * 关联的法律法规列表 + */ + @TableField(exist = false) + private List laws; + + /** + * 内部类:法律法规实体 + */ + @Data + @EqualsAndHashCode(callSuper = false) + @Accessors(chain = true) + public static class Law implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 法律法规唯一标识(主键) + */ + @TableId(value = "law_id", type = IdType.AUTO) + private Integer lawId; + + /** + * 关联法律类别(外键引用 Categories.category_id) + */ + private Integer categoryId; + + /** + * 法律标题(如《婚姻法》第XX条) + */ + private String title; + + /** + * 法律条款摘要(面向老年人简化表述) + */ + private String summary; + + /** + * 法律条款全文 + */ + private String content; + + /** + * 生效日期 + */ + private LocalDate effectiveDate; + + /** + * 官方参考链接(用于权威性验证) + */ + private String referenceUrl; + } +} diff --git a/api/src/main/java/com/mingchen/model/dto/LoginInfoDTO.java b/api/src/main/java/com/mingchen/model/dto/LoginInfoDTO.java new file mode 100644 index 0000000..d400746 --- /dev/null +++ b/api/src/main/java/com/mingchen/model/dto/LoginInfoDTO.java @@ -0,0 +1,19 @@ +package com.mingchen.model.dto; + +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.ToString; + +/** + * @Description: 登录账号密码 + * @Date: 2024-09-02 + */ +@NoArgsConstructor +@Getter +@Setter +@ToString +public class LoginInfoDTO { + private String email; + private String password; +} diff --git a/api/src/main/java/com/mingchen/model/dto/RegisterReqDTO.java b/api/src/main/java/com/mingchen/model/dto/RegisterReqDTO.java new file mode 100644 index 0000000..0e810dd --- /dev/null +++ b/api/src/main/java/com/mingchen/model/dto/RegisterReqDTO.java @@ -0,0 +1,22 @@ +package com.mingchen.model.dto; + +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.ToString; + +/** + * @ClassName RegisterReqDTO + * @Description: 注册信息 + * @Author: 3177583214@qq.com + */ +@NoArgsConstructor +@Getter +@Setter +@ToString +public class RegisterReqDTO { + private String email; + private String username; + private String password; + private String verifyCode; +} diff --git a/api/src/main/java/com/mingchen/model/req/AiReq.java b/api/src/main/java/com/mingchen/model/req/AiReq.java new file mode 100644 index 0000000..7a9d3ba --- /dev/null +++ b/api/src/main/java/com/mingchen/model/req/AiReq.java @@ -0,0 +1,46 @@ +package com.mingchen.model.req; + +import cn.hutool.core.annotation.Alias; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; + +import java.util.List; + +@NoArgsConstructor +@Data +@Accessors(chain = true) +public class AiReq { + + + /** + * + */ + @Alias("model") + private String model; + /** + * + */ + @Alias("messages") + private List messages; + /** + * + */ + @Alias("stream") + private Boolean stream; + + @NoArgsConstructor + @Data + public static class MessagesDTO { + /** + * + */ + @Alias("role") + private String role; + /** + * + */ + @Alias("content") + private String content; + } +} diff --git a/api/src/main/java/com/mingchen/model/resp/AiResp.java b/api/src/main/java/com/mingchen/model/resp/AiResp.java new file mode 100644 index 0000000..c253380 --- /dev/null +++ b/api/src/main/java/com/mingchen/model/resp/AiResp.java @@ -0,0 +1,134 @@ +package com.mingchen.model.resp; + +import cn.hutool.core.annotation.Alias; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +@NoArgsConstructor +@Data +public class AiResp { + + + /** + * + */ + @Alias("choices") + private List choices; + /** + * + */ + @Alias("created") + private Integer created; + /** + * + */ + @Alias("id") + private String id; + /** + * + */ + @Alias("model") + private String model; + /** + * + */ + @Alias("object") + private String object; + /** + * + */ + @Alias("usage") + private UsageDTO usage; + + @NoArgsConstructor + @Data + public static class UsageDTO { + /** + * + */ + @Alias("completionTokens") + private Integer completionTokens; + /** + * + */ + @Alias("promptTokens") + private Integer promptTokens; + /** + * + */ + @Alias("totalTokens") + private Integer totalTokens; + /** + * + */ + @Alias("promptTokensDetails") + private PromptTokensDetailsDTO promptTokensDetails; + /** + * + */ + @Alias("completionTokensDetails") + private CompletionTokensDetailsDTO completionTokensDetails; + + @NoArgsConstructor + @Data + public static class PromptTokensDetailsDTO { + /** + * + */ + @Alias("cachedTokens") + private Integer cachedTokens; + } + + @NoArgsConstructor + @Data + public static class CompletionTokensDetailsDTO { + /** + * + */ + @Alias("reasoningTokens") + private Integer reasoningTokens; + } + } + + @NoArgsConstructor + @Data + public static class ChoicesDTO { + /** + * + */ + @Alias("finishReason") + private String finishReason; + /** + * + */ + @Alias("index") + private Integer index; + /** + * + */ + @Alias("logprobs") + private Object logprobs; + /** + * + */ + @Alias("message") + private MessageDTO message; + + @NoArgsConstructor + @Data + public static class MessageDTO { + /** + * + */ + @Alias("content") + private String content; + /** + * + */ + @Alias("role") + private String role; + } + } +} diff --git a/api/src/main/java/com/mingchen/model/vo/PageResult.java b/api/src/main/java/com/mingchen/model/vo/PageResult.java new file mode 100644 index 0000000..dd511f6 --- /dev/null +++ b/api/src/main/java/com/mingchen/model/vo/PageResult.java @@ -0,0 +1,26 @@ +package com.mingchen.model.vo; + +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.ToString; + +import java.util.List; + +/** + * @Description: 分页结果 + * @Date: 2024-08-08 + */ +@NoArgsConstructor +@Getter +@Setter +@ToString +public class PageResult { + private Integer totalPage;//总页数 + private List list;//数据 + + public PageResult(Integer totalPage, List list) { + this.totalPage = totalPage; + this.list = list; + } +} diff --git a/api/src/main/java/com/mingchen/model/vo/Result.java b/api/src/main/java/com/mingchen/model/vo/Result.java new file mode 100644 index 0000000..c0bc5df --- /dev/null +++ b/api/src/main/java/com/mingchen/model/vo/Result.java @@ -0,0 +1,57 @@ +package com.mingchen.model.vo; + +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.ToString; + +/** + * @Description: 封装响应结果 + * @Date: 2024-07-19 + */ + +@NoArgsConstructor +@Getter +@Setter +@ToString +public class Result { + private Integer code; + private String msg; + private Object data; + + private Result(Integer code, String msg) { + this.code = code; + this.msg = msg; + this.data = null; + } + + private Result(Integer code, String msg, Object data) { + this.code = code; + this.msg = msg; + this.data = data; + } + + public static Result ok(String msg, Object data) { + return new Result(200, msg, data); + } + + public static Result ok(String msg) { + return new Result(200, msg); + } + + public static Result error(String msg) { + return new Result(500, msg); + } + + public static Result error() { + return new Result(500, "异常错误"); + } + + public static Result create(Integer code, String msg, Object data) { + return new Result(code, msg, data); + } + + public static Result create(Integer code, String msg) { + return new Result(code, msg); + } +} diff --git a/api/src/main/java/com/mingchen/service/ICategoriesService.java b/api/src/main/java/com/mingchen/service/ICategoriesService.java new file mode 100644 index 0000000..67d895f --- /dev/null +++ b/api/src/main/java/com/mingchen/service/ICategoriesService.java @@ -0,0 +1,18 @@ +package com.mingchen.service; + +import com.mingchen.entity.Categories; +import com.baomidou.mybatisplus.extension.service.IService; +import com.mingchen.model.vo.Result; + +/** + *

+ * 服务类 + *

+ * + * @author mingchen + * @since 2025-04-17 + */ +public interface ICategoriesService extends IService { + + Result getCategories(); +} diff --git a/api/src/main/java/com/mingchen/service/ILawsService.java b/api/src/main/java/com/mingchen/service/ILawsService.java new file mode 100644 index 0000000..74bd8b9 --- /dev/null +++ b/api/src/main/java/com/mingchen/service/ILawsService.java @@ -0,0 +1,16 @@ +package com.mingchen.service; + +import com.mingchen.entity.Laws; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + *

+ * 服务类 + *

+ * + * @author mingchen + * @since 2025-04-17 + */ +public interface ILawsService extends IService { + +} diff --git a/api/src/main/java/com/mingchen/service/ILearningResourcesService.java b/api/src/main/java/com/mingchen/service/ILearningResourcesService.java new file mode 100644 index 0000000..9ea160e --- /dev/null +++ b/api/src/main/java/com/mingchen/service/ILearningResourcesService.java @@ -0,0 +1,19 @@ +package com.mingchen.service; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.mingchen.entity.LearningResources; +import com.baomidou.mybatisplus.extension.service.IService; +import com.mingchen.model.vo.Result; + +/** + *

+ * 服务类 + *

+ * + * @author mingchen + * @since 2025-04-17 + */ +public interface ILearningResourcesService extends IService { + + Result getLearningResources(int current, int size); +} diff --git a/api/src/main/java/com/mingchen/service/ILegalAidResourcesService.java b/api/src/main/java/com/mingchen/service/ILegalAidResourcesService.java new file mode 100644 index 0000000..c509998 --- /dev/null +++ b/api/src/main/java/com/mingchen/service/ILegalAidResourcesService.java @@ -0,0 +1,18 @@ +package com.mingchen.service; + +import com.mingchen.entity.LegalAidResources; +import com.baomidou.mybatisplus.extension.service.IService; +import com.mingchen.model.vo.Result; + +/** + *

+ * 服务类 + *

+ * + * @author mingchen + * @since 2025-04-17 + */ +public interface ILegalAidResourcesService extends IService { + + Result getLegalAidResources(int current, int size); +} diff --git a/api/src/main/java/com/mingchen/service/LoginLogService.java b/api/src/main/java/com/mingchen/service/LoginLogService.java new file mode 100644 index 0000000..2bafb5f --- /dev/null +++ b/api/src/main/java/com/mingchen/service/LoginLogService.java @@ -0,0 +1,6 @@ +package com.mingchen.service; + +public interface LoginLogService { + + void deleteLoginLogById(Long id); +} diff --git a/api/src/main/java/com/mingchen/service/RegisterService.java b/api/src/main/java/com/mingchen/service/RegisterService.java new file mode 100644 index 0000000..2989440 --- /dev/null +++ b/api/src/main/java/com/mingchen/service/RegisterService.java @@ -0,0 +1,18 @@ +package com.mingchen.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.mingchen.entity.User; +import com.mingchen.model.dto.RegisterReqDTO; +import com.mingchen.model.vo.Result; + +/** + * @ClassName RegisterService + * @Description: TODO + * @Author: 3177583214@qq.com + */ + +public interface RegisterService extends IService { + void send(String userEmail); + + Result register(RegisterReqDTO registerReqDTO); +} diff --git a/api/src/main/java/com/mingchen/service/UserService.java b/api/src/main/java/com/mingchen/service/UserService.java new file mode 100644 index 0000000..14bf630 --- /dev/null +++ b/api/src/main/java/com/mingchen/service/UserService.java @@ -0,0 +1,16 @@ +package com.mingchen.service; + + +import com.baomidou.mybatisplus.extension.service.IService; +import com.mingchen.entity.User; +import com.mingchen.model.dto.LoginInfoDTO; +import com.mingchen.model.vo.Result; + +public interface UserService extends IService { +// User findUserByUsernameAndPassword(String username, String password); + + User findUserByEmailAndPassword(LoginInfoDTO loginInfoDTO); + + + Result getUserInfo(); +} diff --git a/api/src/main/java/com/mingchen/service/impl/CategoriesServiceImpl.java b/api/src/main/java/com/mingchen/service/impl/CategoriesServiceImpl.java new file mode 100644 index 0000000..f71f529 --- /dev/null +++ b/api/src/main/java/com/mingchen/service/impl/CategoriesServiceImpl.java @@ -0,0 +1,36 @@ +package com.mingchen.service.impl; + +import com.mingchen.entity.Categories; +import com.mingchen.mapper.CategoriesMapper; +import com.mingchen.model.dto.CategoryWithLaws; +import com.mingchen.model.vo.Result; +import com.mingchen.service.ICategoriesService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + *

+ * 服务实现类 + *

+ * + * @author mingchen + * @since 2025-04-17 + */ +@Service +public class CategoriesServiceImpl extends ServiceImpl implements ICategoriesService { + @Autowired + private CategoriesMapper categoriesMapper; + @Override + public Result getCategories() { + try { + // 加入缓存 + List allCategoriesWithLaws = categoriesMapper.getAllCategoriesWithLaws(); + return Result.ok("获取成功",allCategoriesWithLaws); + } catch (Exception e) { + return Result.error(e.getMessage()); + } + } +} diff --git a/api/src/main/java/com/mingchen/service/impl/LawsServiceImpl.java b/api/src/main/java/com/mingchen/service/impl/LawsServiceImpl.java new file mode 100644 index 0000000..3132025 --- /dev/null +++ b/api/src/main/java/com/mingchen/service/impl/LawsServiceImpl.java @@ -0,0 +1,20 @@ +package com.mingchen.service.impl; + +import com.mingchen.entity.Laws; +import com.mingchen.mapper.LawsMapper; +import com.mingchen.service.ILawsService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +/** + *

+ * 服务实现类 + *

+ * + * @author mingchen + * @since 2025-04-17 + */ +@Service +public class LawsServiceImpl extends ServiceImpl implements ILawsService { + +} diff --git a/api/src/main/java/com/mingchen/service/impl/LearningResourcesServiceImpl.java b/api/src/main/java/com/mingchen/service/impl/LearningResourcesServiceImpl.java new file mode 100644 index 0000000..1ff4403 --- /dev/null +++ b/api/src/main/java/com/mingchen/service/impl/LearningResourcesServiceImpl.java @@ -0,0 +1,44 @@ +package com.mingchen.service.impl; + +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; +import com.mingchen.entity.LearningResources; +import com.mingchen.mapper.LearningResourcesMapper; +import com.mingchen.model.vo.Result; +import com.mingchen.service.ILearningResourcesService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; + +import java.util.List; + +/** + *

+ * 服务实现类 + *

+ * + * @author mingchen + * @since 2025-04-17 + */ +@Service +public class LearningResourcesServiceImpl extends ServiceImpl implements ILearningResourcesService { + + @Autowired + private LearningResourcesMapper learningResourcesMapper; + @Override + public Result getLearningResources(int current, int size) { + + PageHelper.startPage(current, size); + + List learningResources = learningResourcesMapper.selectList(null); + PageInfo pageInfo = new PageInfo<>(learningResources); + return Result.ok("",pageInfo); + + } +} diff --git a/api/src/main/java/com/mingchen/service/impl/LegalAidResourcesServiceImpl.java b/api/src/main/java/com/mingchen/service/impl/LegalAidResourcesServiceImpl.java new file mode 100644 index 0000000..273d771 --- /dev/null +++ b/api/src/main/java/com/mingchen/service/impl/LegalAidResourcesServiceImpl.java @@ -0,0 +1,38 @@ +package com.mingchen.service.impl; + +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; +import com.mingchen.entity.LearningResources; +import com.mingchen.entity.LegalAidResources; +import com.mingchen.mapper.LegalAidResourcesMapper; +import com.mingchen.model.vo.Result; +import com.mingchen.service.ILegalAidResourcesService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + *

+ * 服务实现类 + *

+ * + * @author mingchen + * @since 2025-04-17 + */ +@Service +public class LegalAidResourcesServiceImpl extends ServiceImpl implements ILegalAidResourcesService { + + @Autowired + private LegalAidResourcesMapper legalAidResourcesMapper; + @Override + public Result getLegalAidResources(int current, int size) { + PageHelper.startPage(current, size); + + List legalAidResources = legalAidResourcesMapper.selectList(null); + PageInfo pageInfo = new PageInfo<>(legalAidResources); + return Result.ok("",pageInfo); + + } +} diff --git a/api/src/main/java/com/mingchen/service/impl/LoginLogServiceImpl.java b/api/src/main/java/com/mingchen/service/impl/LoginLogServiceImpl.java new file mode 100644 index 0000000..0c63dd0 --- /dev/null +++ b/api/src/main/java/com/mingchen/service/impl/LoginLogServiceImpl.java @@ -0,0 +1,36 @@ +package com.mingchen.service.impl; + +import com.itmingchen.common.expcetions.PersistenceException; +import com.itmingchen.common.utils.DateUtils; +import com.itmingchen.common.utils.UserAgentUtils; +import com.mingchen.mapper.LoginLogMapper; +import com.mingchen.service.LoginLogService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Date; + +/** + * @Description: 登录日志业务层实现 + * @Date: 2024-12-03 + */ +@Service +public class LoginLogServiceImpl implements LoginLogService { + @Autowired + LoginLogMapper loginLogMapper; + @Autowired + UserAgentUtils userAgentUtils; + + + + + @Transactional + @Override + public void deleteLoginLogById(Long id) { + Date date = DateUtils.addDays(1); + if (loginLogMapper.deleteLoginLogById(id) != 1) { + throw new PersistenceException("删除日志失败"); + } + } +} diff --git a/api/src/main/java/com/mingchen/service/impl/PlatformServiceImpl.java b/api/src/main/java/com/mingchen/service/impl/PlatformServiceImpl.java new file mode 100644 index 0000000..90b2e94 --- /dev/null +++ b/api/src/main/java/com/mingchen/service/impl/PlatformServiceImpl.java @@ -0,0 +1,30 @@ +package com.mingchen.service.impl; + +import com.mingchen.api.sdk.AiService; +import com.mingchen.model.req.AiReq; +import com.mingchen.model.resp.AiResp; +import com.mingchen.model.vo.Result; +import org.springframework.stereotype.Service; +import java.util.ArrayList; + +@Service +public class PlatformServiceImpl { + public Result getChat(String content) { + try { + AiService aiService = new AiService(); + AiReq.MessagesDTO messagesDTO = new AiReq.MessagesDTO(); + messagesDTO.setContent(content).setRole("user"); + ArrayList messagesDTOS = new ArrayList<>(); + messagesDTOS.add(messagesDTO); + AiReq aiReq = new AiReq(); + aiReq.setModel("gpt-3.5-turbo") + .setMessages(messagesDTOS) + .setStream(false); + AiResp chatApi = aiService.getChatApi("https://chatapi.littlewheat.com/v1/chat/completions", "sk-jSkqRJhJFIqZ3gcdjyqyAbpN8YfnAvYiVxbpzydqPckJSaG2", aiReq); + String resContent = chatApi.getChoices().get(0).getMessage().getContent(); + return Result.ok("获取成功",resContent); + } catch (Exception e) { + return Result.error(e.getMessage()); + } + } +} diff --git a/api/src/main/java/com/mingchen/service/impl/RegisterServiceImpl.java b/api/src/main/java/com/mingchen/service/impl/RegisterServiceImpl.java new file mode 100644 index 0000000..22536e6 --- /dev/null +++ b/api/src/main/java/com/mingchen/service/impl/RegisterServiceImpl.java @@ -0,0 +1,136 @@ +package com.mingchen.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.itmingchen.common.expcetions.ErrorRequestException; +import com.itmingchen.common.utils.MailUtils; +import com.itmingchen.common.utils.RedisUtil; +import com.itmingchen.common.utils.StringUtils; +import com.mingchen.common.constant.RedisConstants; +import com.mingchen.entity.User; +import com.mingchen.mapper.RegisterMapper; +import com.mingchen.model.dto.RegisterReqDTO; +import com.mingchen.model.vo.Result; +import com.mingchen.service.RegisterService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.security.SecureRandom; +import java.time.LocalDateTime; +import java.util.HashMap; +import java.util.regex.Pattern; + +/** + * @ClassName RegisterServiceImpl + * @Description: TODO + * @Author: 3177583214@qq.com + */ +@Service +@Slf4j +public class RegisterServiceImpl extends ServiceImpl implements RegisterService { + @Autowired + private MailUtils mailUtils; + @Autowired + private RedisUtil redisUtil; + @Autowired + private RegisterMapper registerMapper; + @Autowired + private PasswordEncoder passwordEncoder; + + // RFC 5322 标准正则(支持 99% 合法邮箱) + private static final String EMAIL_REGEX = + "^[a-zA-Z0-9_!#$%&'*+/=?`{|}~^.-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$"; + + private static final Pattern PATTERN = Pattern.compile(EMAIL_REGEX); + @Override + public void send(String userEmail) { + // 校验 email 是否存在 + if(StringUtils.isEmpty(userEmail)){ + log.debug("不能发送验证码,邮箱不存在"); + throw new ErrorRequestException("不能发送验证码,邮箱不存在"); + + } + // 校验 email 是否符合格式 + if (!isValid(userEmail)) { + log.debug("邮箱格式无效"); + throw new ErrorRequestException("邮箱格式无效"); + } + + // 向对方邮箱发送验证码 + SecureRandom secureRandom = new SecureRandom(); + // 生成加密安全的随机数(适用于验证码) + String emailCode = String.format("%04d", secureRandom.nextInt(10000)); + + try { + // 发送验证码 + mailUtils.sendSimpleMail(userEmail,"[Navigation] Please verify your device",emailCode); + log.info("验证码为:"+emailCode); + log.info("验证码已发送至邮箱"); + } catch (Exception e) { + log.error("进入 catch 块", e); + throw new ErrorRequestException("发送验证码失败"); + } + + // 将验证码信息存入redis + HashMap map = new HashMap<>(); + map.put(userEmail,emailCode); + // 若有相同的可以,每一次都会进行更新新值,所以这里不需要将相应的key删除 + redisUtil.setHashPro(RedisConstants.EMAIL_CODE_MAP,map,1000); + + } + + @Override + @Transactional(rollbackFor = Exception.class) + public Result register(RegisterReqDTO registerReqDTO) { + + // 验证 验证码 是否存在 以及验证验证码和redis保存的值是否相同 + String verifyCode = null; + try { + verifyCode = redisUtil.getHashItem(RedisConstants.EMAIL_CODE_MAP, registerReqDTO.getEmail()).toString(); + } catch (Exception e) { + throw new ErrorRequestException("请获取验证码后登录"); + } + if(StringUtils.isEmpty(registerReqDTO.getVerifyCode()) || !StringUtils.equals(registerReqDTO.getVerifyCode(), verifyCode)){ + throw new ErrorRequestException("短信验证码失效,请重新获取验证码"); + } + // 查询数据是否有相同的邮箱 + + LambdaQueryWrapper userLambdaQueryWrapper = Wrappers.lambdaQuery().eq(User::getEmail, registerReqDTO.getEmail()); + User userInfo = registerMapper.selectOne(userLambdaQueryWrapper); + if(userInfo!=null){ + throw new ErrorRequestException("邮箱已被注册"); + } + + + + // 若没有,可允许注册成功 + User user = new User(); + user.setEmail(registerReqDTO.getEmail()) + .setUsername(registerReqDTO.getUsername()) + .setPassword(passwordEncoder.encode(registerReqDTO.getPassword())) + .setCreateTime(LocalDateTime.now()) + .setUpdateTime(LocalDateTime.now()) + .setRole("ROLE_admin"); + + + int insert = registerMapper.insert(user); + if(insert != 1){ + throw new ErrorRequestException("注册失败,请重新尝试"); + } + + + HashMap map = new HashMap<>(); + registerReqDTO.setPassword(null); + map.put("register",registerReqDTO); + return Result.ok("注册成功",map); + } + + public static boolean isValid(String email) { + if (email == null || email.isEmpty()) return false; + return PATTERN.matcher(email).matches(); + } +} diff --git a/api/src/main/java/com/mingchen/service/impl/UserServiceImpl.java b/api/src/main/java/com/mingchen/service/impl/UserServiceImpl.java new file mode 100644 index 0000000..133feb2 --- /dev/null +++ b/api/src/main/java/com/mingchen/service/impl/UserServiceImpl.java @@ -0,0 +1,91 @@ +package com.mingchen.service.impl; + +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.itmingchen.common.expcetions.ErrorRequestException; +import com.itmingchen.common.utils.BeanUtils; +import com.itmingchen.common.utils.StringUtils; +import com.mingchen.common.constant.RedisConstants; +import com.mingchen.entity.User; +import com.mingchen.entity.UserContext; +import com.mingchen.mapper.UserMapper; +import com.mingchen.model.dto.LoginInfoDTO; +import com.mingchen.model.vo.Result; +import com.mingchen.service.UserService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.security.core.userdetails.UsernameNotFoundException; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.stereotype.Service; + +/** + * @Description: 用户业务层接口实现类 + * @Date: 2024-07-19 + */ +@Service +public class UserServiceImpl extends ServiceImpl implements UserService, UserDetailsService { + @Autowired + private UserMapper userMapper; + @Autowired + private PasswordEncoder passwordEncoder; + + @Override + public UserDetails loadUserByUsername(String email) throws UsernameNotFoundException { + + LambdaQueryWrapper userLambdaQueryWrapper = Wrappers.lambdaQuery().eq(User::getEmail, email); + User user = userMapper.selectOne(userLambdaQueryWrapper); + user.setUsername(user.getEmail()); + if (ObjectUtil.isNull(user)) { + throw new UsernameNotFoundException("邮箱未注册,请注册"); + } + return user; + } + + @Override + public User findUserByEmailAndPassword(LoginInfoDTO loginInfoDTO) { + // 校验邮箱是否存在 + if(StringUtils.isEmpty(loginInfoDTO.getEmail())) throw new ErrorRequestException("请输入邮箱"); + // 校验密码是否存在 + if(StringUtils.isEmpty(loginInfoDTO.getPassword())) throw new ErrorRequestException("请输入密码"); + + // 通过唯一约束 email 获取 User 信息 + LambdaQueryWrapper userLambdaQueryWrapper = Wrappers.lambdaQuery().eq(User::getEmail, loginInfoDTO.getEmail()); + User user = userMapper.selectOne(userLambdaQueryWrapper); + + // 校验用户信息是否获取成功 + if(ObjectUtil.isNull(user)) throw new ErrorRequestException("邮箱未注册,请注册"); + + // 比对验证码是否相同 + if(!passwordEncoder.matches(loginInfoDTO.getPassword(), user.getPassword())) throw new ErrorRequestException("密码错误,请重新输入"); + + + return user; + } + + + @Override + public Result getUserInfo() { + try { + Long id = UserContext.currentUser().getId(); + String email = UserContext.currentUserEmail(); + if(ObjectUtil.isNull(id)){ + throw new ErrorRequestException("ID 为空 ,请重新请求"); + } + User user = userMapper.selectById(id); + if(!StringUtils.equalsAnyIgnoreCase(user.getEmail(),email)){ + throw new ErrorRequestException("用户数据存在错误,不能进行返回"); + } + user.setPassword(null); + return Result.ok("用户信息成功返回",user); + } catch (Exception e) { + log.error(e.getMessage()); + return Result.error(e.getMessage()); + } + + } + + +} diff --git a/api/src/main/resources/application-dev.properties b/api/src/main/resources/application-dev.properties new file mode 100644 index 0000000..e731262 --- /dev/null +++ b/api/src/main/resources/application-dev.properties @@ -0,0 +1,56 @@ +server.port=9092 +#server.ssl.key-store = classpath:itmingchen.cn.jks +#server.ssl.key-store-password = 302iycod +#server.ssl.keyStoreType = JKS +# ????????????ip?????????? https://xxx.xxx +# ??cms +#custom.url.cms=https://121.40.211.28:8080 +# ???? +#custom.url.website=http://itmingchen.cn +spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver +spring.datasource.url=jdbc:mysql://113.44.0.193:3306/legal?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8&serverTimezone=GMT%2B8&allowPublicKeyRetrieval=true +spring.datasource.username=root +spring.datasource.password=317758lph + +spring.redis.host=8.155.44.59 +spring.redis.password=317758lph +spring.redis.port=6379 +spring.redis.database=0 +spring.redis.timeout=10000ms + +pagehelper.helper-dialect=mysql +pagehelper.reasonable=true +pagehelper.support-methods-arguments=true +pagehelper.params=count=countSql + + + +mybatis.mapper-locations=classpath:mapper/*.xml +mybatis.configuration.map-underscore-to-camel-case=true +mybatis.type-aliases-package=com.mingchen.mapper + +logging.level.root=info +logging.level.com.mingchen=debug +logging.file.path=log/blog-dev +logging.level.com.baomidou.mybatisplus.core.override: TRACE + + +# 1000 * 60 * 60 * 24 * 3 = 3? +token.expireTime=259200000 +# ??????????????????token??? +token.secretKey= + +mingchen.jwtKey=migngchensafeqwertyuiopasdfghjklzxcvbnm + + +spring.mail.host=smtp.qq.com +spring.mail.port=465 + +spring.mail.properties.mail.smtp.auth=true +spring.mail.properties.mail.smtp.starttls.enable=true +spring.mail.properties.mail.smtp.starttls.required=true +spring.mail.username=3177583214@qq.com +spring.mail.password=iuozpvjwauuuddag +spring.mail.properties.mail.smtp.ssl.enable=true +spring.mail.properties.mail.smtp.ssl.protocols=TLSv1.2 +#spring.mail.properties.mail.debug=true \ No newline at end of file diff --git a/api/src/main/resources/application.properties b/api/src/main/resources/application.properties new file mode 100644 index 0000000..257b306 --- /dev/null +++ b/api/src/main/resources/application.properties @@ -0,0 +1 @@ +spring.profiles.active=dev \ No newline at end of file diff --git a/api/src/main/resources/ipdb/ip2region.db b/api/src/main/resources/ipdb/ip2region.db new file mode 100644 index 0000000..b688511 Binary files /dev/null and b/api/src/main/resources/ipdb/ip2region.db differ diff --git a/api/src/main/resources/itmingchen.cn.jks b/api/src/main/resources/itmingchen.cn.jks new file mode 100644 index 0000000..5a6eb65 Binary files /dev/null and b/api/src/main/resources/itmingchen.cn.jks differ diff --git a/api/src/main/resources/logback-spring.xml b/api/src/main/resources/logback-spring.xml new file mode 100644 index 0000000..f37c03d --- /dev/null +++ b/api/src/main/resources/logback-spring.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + ${FILE_LOG_PATTERN} + + + + + ${LOG_FILE}-%d{yyyy-MM-dd}-%i.log + 365 + + + 10MB + + + + + + + + + \ No newline at end of file diff --git a/api/src/main/resources/mapper/CategoriesMapper.xml b/api/src/main/resources/mapper/CategoriesMapper.xml new file mode 100644 index 0000000..f3b3291 --- /dev/null +++ b/api/src/main/resources/mapper/CategoriesMapper.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/api/src/main/resources/mapper/LawsMapper.xml b/api/src/main/resources/mapper/LawsMapper.xml new file mode 100644 index 0000000..71641b5 --- /dev/null +++ b/api/src/main/resources/mapper/LawsMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/api/src/main/resources/mapper/LearningResourcesMapper.xml b/api/src/main/resources/mapper/LearningResourcesMapper.xml new file mode 100644 index 0000000..500e888 --- /dev/null +++ b/api/src/main/resources/mapper/LearningResourcesMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/api/src/main/resources/mapper/LegalAidResourcesMapper.xml b/api/src/main/resources/mapper/LegalAidResourcesMapper.xml new file mode 100644 index 0000000..9244d3c --- /dev/null +++ b/api/src/main/resources/mapper/LegalAidResourcesMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/api/src/main/resources/mapper/RegisterMapper.xml b/api/src/main/resources/mapper/RegisterMapper.xml new file mode 100644 index 0000000..1095340 --- /dev/null +++ b/api/src/main/resources/mapper/RegisterMapper.xml @@ -0,0 +1,13 @@ + + + + + + + + + delete + from login_log + where id = #{id} + + \ No newline at end of file diff --git a/api/src/main/resources/mapper/UserMapper.xml b/api/src/main/resources/mapper/UserMapper.xml new file mode 100644 index 0000000..e1ccaec --- /dev/null +++ b/api/src/main/resources/mapper/UserMapper.xml @@ -0,0 +1,12 @@ + + + + + + + diff --git a/api/src/main/resources/templates/guest.html b/api/src/main/resources/templates/guest.html new file mode 100644 index 0000000..3c785b6 --- /dev/null +++ b/api/src/main/resources/templates/guest.html @@ -0,0 +1,38 @@ + + + + + Title + + +
+
+
+
+

+ 您在的评论有了新的回复~ +

+
+

时间:

+

您的评论:

+

+

 给您的回复:

+

+
+
+
+

萤火虫消失之后,那光的轨迹仍久久地印在我的脑际。那微弱浅淡的光点,仿佛迷失方向的魂灵,在漆黑厚重的夜幕中彷徨。——《挪威的森林》村上春树

+
+ 查看回复的完整內容 +
+

本邮件为系统自动发送,回复TD退订~

+
+
+ + \ No newline at end of file diff --git a/api/src/main/resources/templates/owner.html b/api/src/main/resources/templates/owner.html new file mode 100644 index 0000000..fffb832 --- /dev/null +++ b/api/src/main/resources/templates/owner.html @@ -0,0 +1,30 @@ + + + + + Title + + +
+
+
+

+ 您的文章有了新的评论~

+
+

时间:

+

 给您的评论:

+

+

其他信息:

+



[管理评论]

+
+
+ 查看回复的完整內容 +
+ + \ No newline at end of file diff --git a/api/src/test/java/com/mingchen/BlogApiApplicationTests.java b/api/src/test/java/com/mingchen/BlogApiApplicationTests.java new file mode 100644 index 0000000..758bef8 --- /dev/null +++ b/api/src/test/java/com/mingchen/BlogApiApplicationTests.java @@ -0,0 +1,38 @@ +package com.mingchen; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.mingchen.entity.User; +import com.mingchen.mapper.CategoriesMapper; +import com.mingchen.mapper.UserMapper; +import com.mingchen.model.dto.CategoryWithLaws; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +import java.util.List; + + +@SpringBootTest +class BlogApiApplicationTests { + + @Autowired + private UserMapper userMapper; + @Autowired + private CategoriesMapper categoriesMapper; + + @Test + void test01() { + LambdaQueryWrapper userLambdaQueryWrapper = Wrappers.lambdaQuery().eq(User::getEmail, "admin@gmail.com"); + User user = userMapper.selectOne(userLambdaQueryWrapper); + System.out.println(user); + } + + @Test + void test02() { + List allCategoriesWithLaws = categoriesMapper.getAllCategoriesWithLaws(); + System.out.println(allCategoriesWithLaws); + } + + +} diff --git a/api/target/classes/application-dev.properties b/api/target/classes/application-dev.properties new file mode 100644 index 0000000..e731262 --- /dev/null +++ b/api/target/classes/application-dev.properties @@ -0,0 +1,56 @@ +server.port=9092 +#server.ssl.key-store = classpath:itmingchen.cn.jks +#server.ssl.key-store-password = 302iycod +#server.ssl.keyStoreType = JKS +# ????????????ip?????????? https://xxx.xxx +# ??cms +#custom.url.cms=https://121.40.211.28:8080 +# ???? +#custom.url.website=http://itmingchen.cn +spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver +spring.datasource.url=jdbc:mysql://113.44.0.193:3306/legal?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8&serverTimezone=GMT%2B8&allowPublicKeyRetrieval=true +spring.datasource.username=root +spring.datasource.password=317758lph + +spring.redis.host=8.155.44.59 +spring.redis.password=317758lph +spring.redis.port=6379 +spring.redis.database=0 +spring.redis.timeout=10000ms + +pagehelper.helper-dialect=mysql +pagehelper.reasonable=true +pagehelper.support-methods-arguments=true +pagehelper.params=count=countSql + + + +mybatis.mapper-locations=classpath:mapper/*.xml +mybatis.configuration.map-underscore-to-camel-case=true +mybatis.type-aliases-package=com.mingchen.mapper + +logging.level.root=info +logging.level.com.mingchen=debug +logging.file.path=log/blog-dev +logging.level.com.baomidou.mybatisplus.core.override: TRACE + + +# 1000 * 60 * 60 * 24 * 3 = 3? +token.expireTime=259200000 +# ??????????????????token??? +token.secretKey= + +mingchen.jwtKey=migngchensafeqwertyuiopasdfghjklzxcvbnm + + +spring.mail.host=smtp.qq.com +spring.mail.port=465 + +spring.mail.properties.mail.smtp.auth=true +spring.mail.properties.mail.smtp.starttls.enable=true +spring.mail.properties.mail.smtp.starttls.required=true +spring.mail.username=3177583214@qq.com +spring.mail.password=iuozpvjwauuuddag +spring.mail.properties.mail.smtp.ssl.enable=true +spring.mail.properties.mail.smtp.ssl.protocols=TLSv1.2 +#spring.mail.properties.mail.debug=true \ No newline at end of file diff --git a/api/target/classes/application.properties b/api/target/classes/application.properties new file mode 100644 index 0000000..257b306 --- /dev/null +++ b/api/target/classes/application.properties @@ -0,0 +1 @@ +spring.profiles.active=dev \ No newline at end of file diff --git a/api/target/classes/com/mingchen/BlogApiApplication.class b/api/target/classes/com/mingchen/BlogApiApplication.class new file mode 100644 index 0000000..cc116b9 Binary files /dev/null and b/api/target/classes/com/mingchen/BlogApiApplication.class differ diff --git a/api/target/classes/com/mingchen/api/open/ApiController.class b/api/target/classes/com/mingchen/api/open/ApiController.class new file mode 100644 index 0000000..057bc4d Binary files /dev/null and b/api/target/classes/com/mingchen/api/open/ApiController.class differ diff --git a/api/target/classes/com/mingchen/api/open/CategoriesController.class b/api/target/classes/com/mingchen/api/open/CategoriesController.class new file mode 100644 index 0000000..869677c Binary files /dev/null and b/api/target/classes/com/mingchen/api/open/CategoriesController.class differ diff --git a/api/target/classes/com/mingchen/api/open/LawsController.class b/api/target/classes/com/mingchen/api/open/LawsController.class new file mode 100644 index 0000000..42223f9 Binary files /dev/null and b/api/target/classes/com/mingchen/api/open/LawsController.class differ diff --git a/api/target/classes/com/mingchen/api/open/LearningResourcesController.class b/api/target/classes/com/mingchen/api/open/LearningResourcesController.class new file mode 100644 index 0000000..ecb9599 Binary files /dev/null and b/api/target/classes/com/mingchen/api/open/LearningResourcesController.class differ diff --git a/api/target/classes/com/mingchen/api/open/LegalAidResourcesController.class b/api/target/classes/com/mingchen/api/open/LegalAidResourcesController.class new file mode 100644 index 0000000..c1d7139 Binary files /dev/null and b/api/target/classes/com/mingchen/api/open/LegalAidResourcesController.class differ diff --git a/api/target/classes/com/mingchen/api/open/LoginController.class b/api/target/classes/com/mingchen/api/open/LoginController.class new file mode 100644 index 0000000..1fa23b7 Binary files /dev/null and b/api/target/classes/com/mingchen/api/open/LoginController.class differ diff --git a/api/target/classes/com/mingchen/api/open/RegisterController.class b/api/target/classes/com/mingchen/api/open/RegisterController.class new file mode 100644 index 0000000..fe99483 Binary files /dev/null and b/api/target/classes/com/mingchen/api/open/RegisterController.class differ diff --git a/api/target/classes/com/mingchen/api/open/UserController.class b/api/target/classes/com/mingchen/api/open/UserController.class new file mode 100644 index 0000000..7069105 Binary files /dev/null and b/api/target/classes/com/mingchen/api/open/UserController.class differ diff --git a/api/target/classes/com/mingchen/api/sdk/AiService.class b/api/target/classes/com/mingchen/api/sdk/AiService.class new file mode 100644 index 0000000..053c2c0 Binary files /dev/null and b/api/target/classes/com/mingchen/api/sdk/AiService.class differ diff --git a/api/target/classes/com/mingchen/common/config/CustomAuthenticationProvider.class b/api/target/classes/com/mingchen/common/config/CustomAuthenticationProvider.class new file mode 100644 index 0000000..ce97028 Binary files /dev/null and b/api/target/classes/com/mingchen/common/config/CustomAuthenticationProvider.class differ diff --git a/api/target/classes/com/mingchen/common/config/JwtFilter.class b/api/target/classes/com/mingchen/common/config/JwtFilter.class new file mode 100644 index 0000000..5af23de Binary files /dev/null and b/api/target/classes/com/mingchen/common/config/JwtFilter.class differ diff --git a/api/target/classes/com/mingchen/common/config/JwtLoginFilter.class b/api/target/classes/com/mingchen/common/config/JwtLoginFilter.class new file mode 100644 index 0000000..40bc1d0 Binary files /dev/null and b/api/target/classes/com/mingchen/common/config/JwtLoginFilter.class differ diff --git a/api/target/classes/com/mingchen/common/config/MyAuthenticationEntryPoint.class b/api/target/classes/com/mingchen/common/config/MyAuthenticationEntryPoint.class new file mode 100644 index 0000000..04a4d0d Binary files /dev/null and b/api/target/classes/com/mingchen/common/config/MyAuthenticationEntryPoint.class differ diff --git a/api/target/classes/com/mingchen/common/config/SecurityConfig.class b/api/target/classes/com/mingchen/common/config/SecurityConfig.class new file mode 100644 index 0000000..78be98a Binary files /dev/null and b/api/target/classes/com/mingchen/common/config/SecurityConfig.class differ diff --git a/api/target/classes/com/mingchen/common/config/WebConfig.class b/api/target/classes/com/mingchen/common/config/WebConfig.class new file mode 100644 index 0000000..29ba727 Binary files /dev/null and b/api/target/classes/com/mingchen/common/config/WebConfig.class differ diff --git a/api/target/classes/com/mingchen/common/config/configuration/BeanConfiguration.class b/api/target/classes/com/mingchen/common/config/configuration/BeanConfiguration.class new file mode 100644 index 0000000..bb67641 Binary files /dev/null and b/api/target/classes/com/mingchen/common/config/configuration/BeanConfiguration.class differ diff --git a/api/target/classes/com/mingchen/common/config/configuration/MyBatisConfig.class b/api/target/classes/com/mingchen/common/config/configuration/MyBatisConfig.class new file mode 100644 index 0000000..2c15ecb Binary files /dev/null and b/api/target/classes/com/mingchen/common/config/configuration/MyBatisConfig.class differ diff --git a/api/target/classes/com/mingchen/common/config/configuration/RedisConfig.class b/api/target/classes/com/mingchen/common/config/configuration/RedisConfig.class new file mode 100644 index 0000000..2f4d6a3 Binary files /dev/null and b/api/target/classes/com/mingchen/common/config/configuration/RedisConfig.class differ diff --git a/api/target/classes/com/mingchen/common/config/configuration/RedisSerializeConfig.class b/api/target/classes/com/mingchen/common/config/configuration/RedisSerializeConfig.class new file mode 100644 index 0000000..3e7f5e2 Binary files /dev/null and b/api/target/classes/com/mingchen/common/config/configuration/RedisSerializeConfig.class differ diff --git a/api/target/classes/com/mingchen/common/constant/RedisConstants.class b/api/target/classes/com/mingchen/common/constant/RedisConstants.class new file mode 100644 index 0000000..ece5979 Binary files /dev/null and b/api/target/classes/com/mingchen/common/constant/RedisConstants.class differ diff --git a/api/target/classes/com/mingchen/common/handler/ControllerExceptionHandler.class b/api/target/classes/com/mingchen/common/handler/ControllerExceptionHandler.class new file mode 100644 index 0000000..869ca04 Binary files /dev/null and b/api/target/classes/com/mingchen/common/handler/ControllerExceptionHandler.class differ diff --git a/api/target/classes/com/mingchen/common/interceptor/AccessLimit.class b/api/target/classes/com/mingchen/common/interceptor/AccessLimit.class new file mode 100644 index 0000000..5766189 Binary files /dev/null and b/api/target/classes/com/mingchen/common/interceptor/AccessLimit.class differ diff --git a/api/target/classes/com/mingchen/common/interceptor/AccessLimitInterceptor.class b/api/target/classes/com/mingchen/common/interceptor/AccessLimitInterceptor.class new file mode 100644 index 0000000..0ae8e81 Binary files /dev/null and b/api/target/classes/com/mingchen/common/interceptor/AccessLimitInterceptor.class differ diff --git a/api/target/classes/com/mingchen/common/interceptor/UserContextInterceptor.class b/api/target/classes/com/mingchen/common/interceptor/UserContextInterceptor.class new file mode 100644 index 0000000..262ce75 Binary files /dev/null and b/api/target/classes/com/mingchen/common/interceptor/UserContextInterceptor.class differ diff --git a/api/target/classes/com/mingchen/common/properties/ApplicationProperties.class b/api/target/classes/com/mingchen/common/properties/ApplicationProperties.class new file mode 100644 index 0000000..7bb1cff Binary files /dev/null and b/api/target/classes/com/mingchen/common/properties/ApplicationProperties.class differ diff --git a/api/target/classes/com/mingchen/entity/Categories.class b/api/target/classes/com/mingchen/entity/Categories.class new file mode 100644 index 0000000..6c39506 Binary files /dev/null and b/api/target/classes/com/mingchen/entity/Categories.class differ diff --git a/api/target/classes/com/mingchen/entity/CurrentUserInfo.class b/api/target/classes/com/mingchen/entity/CurrentUserInfo.class new file mode 100644 index 0000000..f886ed4 Binary files /dev/null and b/api/target/classes/com/mingchen/entity/CurrentUserInfo.class differ diff --git a/api/target/classes/com/mingchen/entity/Laws.class b/api/target/classes/com/mingchen/entity/Laws.class new file mode 100644 index 0000000..755eae9 Binary files /dev/null and b/api/target/classes/com/mingchen/entity/Laws.class differ diff --git a/api/target/classes/com/mingchen/entity/LearningResources.class b/api/target/classes/com/mingchen/entity/LearningResources.class new file mode 100644 index 0000000..5532f25 Binary files /dev/null and b/api/target/classes/com/mingchen/entity/LearningResources.class differ diff --git a/api/target/classes/com/mingchen/entity/LegalAidResources.class b/api/target/classes/com/mingchen/entity/LegalAidResources.class new file mode 100644 index 0000000..d8e1b9c Binary files /dev/null and b/api/target/classes/com/mingchen/entity/LegalAidResources.class differ diff --git a/api/target/classes/com/mingchen/entity/User.class b/api/target/classes/com/mingchen/entity/User.class new file mode 100644 index 0000000..a306a79 Binary files /dev/null and b/api/target/classes/com/mingchen/entity/User.class differ diff --git a/api/target/classes/com/mingchen/entity/UserContext.class b/api/target/classes/com/mingchen/entity/UserContext.class new file mode 100644 index 0000000..fb12ea9 Binary files /dev/null and b/api/target/classes/com/mingchen/entity/UserContext.class differ diff --git a/api/target/classes/com/mingchen/mapper/CategoriesMapper.class b/api/target/classes/com/mingchen/mapper/CategoriesMapper.class new file mode 100644 index 0000000..c77595b Binary files /dev/null and b/api/target/classes/com/mingchen/mapper/CategoriesMapper.class differ diff --git a/api/target/classes/com/mingchen/mapper/LawsMapper.class b/api/target/classes/com/mingchen/mapper/LawsMapper.class new file mode 100644 index 0000000..0d08460 Binary files /dev/null and b/api/target/classes/com/mingchen/mapper/LawsMapper.class differ diff --git a/api/target/classes/com/mingchen/mapper/LearningResourcesMapper.class b/api/target/classes/com/mingchen/mapper/LearningResourcesMapper.class new file mode 100644 index 0000000..71df2f8 Binary files /dev/null and b/api/target/classes/com/mingchen/mapper/LearningResourcesMapper.class differ diff --git a/api/target/classes/com/mingchen/mapper/LegalAidResourcesMapper.class b/api/target/classes/com/mingchen/mapper/LegalAidResourcesMapper.class new file mode 100644 index 0000000..c78eaac Binary files /dev/null and b/api/target/classes/com/mingchen/mapper/LegalAidResourcesMapper.class differ diff --git a/api/target/classes/com/mingchen/mapper/LoginLogMapper.class b/api/target/classes/com/mingchen/mapper/LoginLogMapper.class new file mode 100644 index 0000000..414623f Binary files /dev/null and b/api/target/classes/com/mingchen/mapper/LoginLogMapper.class differ diff --git a/api/target/classes/com/mingchen/mapper/RegisterMapper.class b/api/target/classes/com/mingchen/mapper/RegisterMapper.class new file mode 100644 index 0000000..90a4099 Binary files /dev/null and b/api/target/classes/com/mingchen/mapper/RegisterMapper.class differ diff --git a/api/target/classes/com/mingchen/mapper/UserMapper.class b/api/target/classes/com/mingchen/mapper/UserMapper.class new file mode 100644 index 0000000..d0c528f Binary files /dev/null and b/api/target/classes/com/mingchen/mapper/UserMapper.class differ diff --git a/api/target/classes/com/mingchen/model/dto/CategoryWithLaws$Law.class b/api/target/classes/com/mingchen/model/dto/CategoryWithLaws$Law.class new file mode 100644 index 0000000..7685c8b Binary files /dev/null and b/api/target/classes/com/mingchen/model/dto/CategoryWithLaws$Law.class differ diff --git a/api/target/classes/com/mingchen/model/dto/CategoryWithLaws.class b/api/target/classes/com/mingchen/model/dto/CategoryWithLaws.class new file mode 100644 index 0000000..6cebc60 Binary files /dev/null and b/api/target/classes/com/mingchen/model/dto/CategoryWithLaws.class differ diff --git a/api/target/classes/com/mingchen/model/dto/LoginInfoDTO.class b/api/target/classes/com/mingchen/model/dto/LoginInfoDTO.class new file mode 100644 index 0000000..13169b3 Binary files /dev/null and b/api/target/classes/com/mingchen/model/dto/LoginInfoDTO.class differ diff --git a/api/target/classes/com/mingchen/model/dto/RegisterReqDTO.class b/api/target/classes/com/mingchen/model/dto/RegisterReqDTO.class new file mode 100644 index 0000000..b3059a5 Binary files /dev/null and b/api/target/classes/com/mingchen/model/dto/RegisterReqDTO.class differ diff --git a/api/target/classes/com/mingchen/model/req/AiReq$MessagesDTO.class b/api/target/classes/com/mingchen/model/req/AiReq$MessagesDTO.class new file mode 100644 index 0000000..0a06ca8 Binary files /dev/null and b/api/target/classes/com/mingchen/model/req/AiReq$MessagesDTO.class differ diff --git a/api/target/classes/com/mingchen/model/req/AiReq.class b/api/target/classes/com/mingchen/model/req/AiReq.class new file mode 100644 index 0000000..cbd0aa0 Binary files /dev/null and b/api/target/classes/com/mingchen/model/req/AiReq.class differ diff --git a/api/target/classes/com/mingchen/model/resp/AiResp$ChoicesDTO$MessageDTO.class b/api/target/classes/com/mingchen/model/resp/AiResp$ChoicesDTO$MessageDTO.class new file mode 100644 index 0000000..2fb7159 Binary files /dev/null and b/api/target/classes/com/mingchen/model/resp/AiResp$ChoicesDTO$MessageDTO.class differ diff --git a/api/target/classes/com/mingchen/model/resp/AiResp$ChoicesDTO.class b/api/target/classes/com/mingchen/model/resp/AiResp$ChoicesDTO.class new file mode 100644 index 0000000..f5b46a2 Binary files /dev/null and b/api/target/classes/com/mingchen/model/resp/AiResp$ChoicesDTO.class differ diff --git a/api/target/classes/com/mingchen/model/resp/AiResp$UsageDTO$CompletionTokensDetailsDTO.class b/api/target/classes/com/mingchen/model/resp/AiResp$UsageDTO$CompletionTokensDetailsDTO.class new file mode 100644 index 0000000..ce0fcce Binary files /dev/null and b/api/target/classes/com/mingchen/model/resp/AiResp$UsageDTO$CompletionTokensDetailsDTO.class differ diff --git a/api/target/classes/com/mingchen/model/resp/AiResp$UsageDTO$PromptTokensDetailsDTO.class b/api/target/classes/com/mingchen/model/resp/AiResp$UsageDTO$PromptTokensDetailsDTO.class new file mode 100644 index 0000000..9f4c5c1 Binary files /dev/null and b/api/target/classes/com/mingchen/model/resp/AiResp$UsageDTO$PromptTokensDetailsDTO.class differ diff --git a/api/target/classes/com/mingchen/model/resp/AiResp$UsageDTO.class b/api/target/classes/com/mingchen/model/resp/AiResp$UsageDTO.class new file mode 100644 index 0000000..28052b7 Binary files /dev/null and b/api/target/classes/com/mingchen/model/resp/AiResp$UsageDTO.class differ diff --git a/api/target/classes/com/mingchen/model/resp/AiResp.class b/api/target/classes/com/mingchen/model/resp/AiResp.class new file mode 100644 index 0000000..eeb7fd8 Binary files /dev/null and b/api/target/classes/com/mingchen/model/resp/AiResp.class differ diff --git a/api/target/classes/com/mingchen/model/vo/PageResult.class b/api/target/classes/com/mingchen/model/vo/PageResult.class new file mode 100644 index 0000000..30e428b Binary files /dev/null and b/api/target/classes/com/mingchen/model/vo/PageResult.class differ diff --git a/api/target/classes/com/mingchen/model/vo/Result.class b/api/target/classes/com/mingchen/model/vo/Result.class new file mode 100644 index 0000000..eba68ed Binary files /dev/null and b/api/target/classes/com/mingchen/model/vo/Result.class differ diff --git a/api/target/classes/com/mingchen/service/ICategoriesService.class b/api/target/classes/com/mingchen/service/ICategoriesService.class new file mode 100644 index 0000000..5beaada Binary files /dev/null and b/api/target/classes/com/mingchen/service/ICategoriesService.class differ diff --git a/api/target/classes/com/mingchen/service/ILawsService.class b/api/target/classes/com/mingchen/service/ILawsService.class new file mode 100644 index 0000000..6ea69e9 Binary files /dev/null and b/api/target/classes/com/mingchen/service/ILawsService.class differ diff --git a/api/target/classes/com/mingchen/service/ILearningResourcesService.class b/api/target/classes/com/mingchen/service/ILearningResourcesService.class new file mode 100644 index 0000000..0ce94c3 Binary files /dev/null and b/api/target/classes/com/mingchen/service/ILearningResourcesService.class differ diff --git a/api/target/classes/com/mingchen/service/ILegalAidResourcesService.class b/api/target/classes/com/mingchen/service/ILegalAidResourcesService.class new file mode 100644 index 0000000..4ec38c1 Binary files /dev/null and b/api/target/classes/com/mingchen/service/ILegalAidResourcesService.class differ diff --git a/api/target/classes/com/mingchen/service/LoginLogService.class b/api/target/classes/com/mingchen/service/LoginLogService.class new file mode 100644 index 0000000..df12c83 Binary files /dev/null and b/api/target/classes/com/mingchen/service/LoginLogService.class differ diff --git a/api/target/classes/com/mingchen/service/RegisterService.class b/api/target/classes/com/mingchen/service/RegisterService.class new file mode 100644 index 0000000..0e151e1 Binary files /dev/null and b/api/target/classes/com/mingchen/service/RegisterService.class differ diff --git a/api/target/classes/com/mingchen/service/UserService.class b/api/target/classes/com/mingchen/service/UserService.class new file mode 100644 index 0000000..973c3d9 Binary files /dev/null and b/api/target/classes/com/mingchen/service/UserService.class differ diff --git a/api/target/classes/com/mingchen/service/impl/CategoriesServiceImpl.class b/api/target/classes/com/mingchen/service/impl/CategoriesServiceImpl.class new file mode 100644 index 0000000..acb4d0a Binary files /dev/null and b/api/target/classes/com/mingchen/service/impl/CategoriesServiceImpl.class differ diff --git a/api/target/classes/com/mingchen/service/impl/LawsServiceImpl.class b/api/target/classes/com/mingchen/service/impl/LawsServiceImpl.class new file mode 100644 index 0000000..8461041 Binary files /dev/null and b/api/target/classes/com/mingchen/service/impl/LawsServiceImpl.class differ diff --git a/api/target/classes/com/mingchen/service/impl/LearningResourcesServiceImpl.class b/api/target/classes/com/mingchen/service/impl/LearningResourcesServiceImpl.class new file mode 100644 index 0000000..f9134c7 Binary files /dev/null and b/api/target/classes/com/mingchen/service/impl/LearningResourcesServiceImpl.class differ diff --git a/api/target/classes/com/mingchen/service/impl/LegalAidResourcesServiceImpl.class b/api/target/classes/com/mingchen/service/impl/LegalAidResourcesServiceImpl.class new file mode 100644 index 0000000..e03ee76 Binary files /dev/null and b/api/target/classes/com/mingchen/service/impl/LegalAidResourcesServiceImpl.class differ diff --git a/api/target/classes/com/mingchen/service/impl/LoginLogServiceImpl.class b/api/target/classes/com/mingchen/service/impl/LoginLogServiceImpl.class new file mode 100644 index 0000000..05cac4c Binary files /dev/null and b/api/target/classes/com/mingchen/service/impl/LoginLogServiceImpl.class differ diff --git a/api/target/classes/com/mingchen/service/impl/PlatformServiceImpl.class b/api/target/classes/com/mingchen/service/impl/PlatformServiceImpl.class new file mode 100644 index 0000000..95f98f7 Binary files /dev/null and b/api/target/classes/com/mingchen/service/impl/PlatformServiceImpl.class differ diff --git a/api/target/classes/com/mingchen/service/impl/RegisterServiceImpl.class b/api/target/classes/com/mingchen/service/impl/RegisterServiceImpl.class new file mode 100644 index 0000000..a58ff8c Binary files /dev/null and b/api/target/classes/com/mingchen/service/impl/RegisterServiceImpl.class differ diff --git a/api/target/classes/com/mingchen/service/impl/UserServiceImpl.class b/api/target/classes/com/mingchen/service/impl/UserServiceImpl.class new file mode 100644 index 0000000..422b2ed Binary files /dev/null and b/api/target/classes/com/mingchen/service/impl/UserServiceImpl.class differ diff --git a/api/target/classes/ipdb/ip2region.db b/api/target/classes/ipdb/ip2region.db new file mode 100644 index 0000000..b688511 Binary files /dev/null and b/api/target/classes/ipdb/ip2region.db differ diff --git a/api/target/classes/itmingchen.cn.jks b/api/target/classes/itmingchen.cn.jks new file mode 100644 index 0000000..5a6eb65 Binary files /dev/null and b/api/target/classes/itmingchen.cn.jks differ diff --git a/api/target/classes/logback-spring.xml b/api/target/classes/logback-spring.xml new file mode 100644 index 0000000..f37c03d --- /dev/null +++ b/api/target/classes/logback-spring.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + ${FILE_LOG_PATTERN} + + + + + ${LOG_FILE}-%d{yyyy-MM-dd}-%i.log + 365 + + + 10MB + + + + + + + + + \ No newline at end of file diff --git a/api/target/classes/mapper/CategoriesMapper.xml b/api/target/classes/mapper/CategoriesMapper.xml new file mode 100644 index 0000000..f3b3291 --- /dev/null +++ b/api/target/classes/mapper/CategoriesMapper.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/api/target/classes/mapper/LawsMapper.xml b/api/target/classes/mapper/LawsMapper.xml new file mode 100644 index 0000000..71641b5 --- /dev/null +++ b/api/target/classes/mapper/LawsMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/api/target/classes/mapper/LearningResourcesMapper.xml b/api/target/classes/mapper/LearningResourcesMapper.xml new file mode 100644 index 0000000..500e888 --- /dev/null +++ b/api/target/classes/mapper/LearningResourcesMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/api/target/classes/mapper/LegalAidResourcesMapper.xml b/api/target/classes/mapper/LegalAidResourcesMapper.xml new file mode 100644 index 0000000..9244d3c --- /dev/null +++ b/api/target/classes/mapper/LegalAidResourcesMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/api/target/classes/mapper/RegisterMapper.xml b/api/target/classes/mapper/RegisterMapper.xml new file mode 100644 index 0000000..1095340 --- /dev/null +++ b/api/target/classes/mapper/RegisterMapper.xml @@ -0,0 +1,13 @@ + + + + + + + + + delete + from login_log + where id = #{id} + + \ No newline at end of file diff --git a/api/target/classes/mapper/UserMapper.xml b/api/target/classes/mapper/UserMapper.xml new file mode 100644 index 0000000..e1ccaec --- /dev/null +++ b/api/target/classes/mapper/UserMapper.xml @@ -0,0 +1,12 @@ + + + + + + + diff --git a/api/target/classes/templates/guest.html b/api/target/classes/templates/guest.html new file mode 100644 index 0000000..3c785b6 --- /dev/null +++ b/api/target/classes/templates/guest.html @@ -0,0 +1,38 @@ + + + + + Title + + +
+
+
+
+

+ 您在的评论有了新的回复~ +

+
+

时间:

+

您的评论:

+

+

 给您的回复:

+

+
+
+
+

萤火虫消失之后,那光的轨迹仍久久地印在我的脑际。那微弱浅淡的光点,仿佛迷失方向的魂灵,在漆黑厚重的夜幕中彷徨。——《挪威的森林》村上春树

+
+ 查看回复的完整內容 +
+

本邮件为系统自动发送,回复TD退订~

+
+
+ + \ No newline at end of file diff --git a/api/target/classes/templates/owner.html b/api/target/classes/templates/owner.html new file mode 100644 index 0000000..fffb832 --- /dev/null +++ b/api/target/classes/templates/owner.html @@ -0,0 +1,30 @@ + + + + + Title + + +
+
+
+

+ 您的文章有了新的评论~

+
+

时间:

+

 给您的评论:

+

+

其他信息:

+



[管理评论]

+
+
+ 查看回复的完整內容 +
+ + \ No newline at end of file diff --git a/framework/.gitignore b/framework/.gitignore new file mode 100644 index 0000000..5ff6309 --- /dev/null +++ b/framework/.gitignore @@ -0,0 +1,38 @@ +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### IntelliJ IDEA ### +.idea/modules.xml +.idea/jarRepositories.xml +.idea/compiler.xml +.idea/libraries/ +*.iws +*.iml +*.ipr + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store \ No newline at end of file diff --git a/framework/common/.gitignore b/framework/common/.gitignore new file mode 100644 index 0000000..5ff6309 --- /dev/null +++ b/framework/common/.gitignore @@ -0,0 +1,38 @@ +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### IntelliJ IDEA ### +.idea/modules.xml +.idea/jarRepositories.xml +.idea/compiler.xml +.idea/libraries/ +*.iws +*.iml +*.ipr + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store \ No newline at end of file diff --git a/framework/common/pom.xml b/framework/common/pom.xml new file mode 100644 index 0000000..bc44907 --- /dev/null +++ b/framework/common/pom.xml @@ -0,0 +1,116 @@ + + + + parent + mingchen + 1.1-SNAPSHOT + ../parent + + 4.0.0 + + common + + + 11 + 11 + + + + + + + org.mybatis.spring.boot + mybatis-spring-boot-starter + 2.2.2 + + + + + + + + + + + cn.hutool + hutool-all + + + io.swagger + swagger-annotations + + + org.springframework + spring-core + provided + + + org.springframework + spring-expression + provided + + + org.aspectj + aspectjweaver + + + com.fasterxml.jackson.datatype + jackson-datatype-jsr310 + + + io.jsonwebtoken + jjwt + 0.9.1 + compile + + + org.springframework.security + spring-security-core + + + nl.basjes.parse.useragent + yauaa + 5.20 + compile + + + jakarta.servlet + jakarta.servlet-api + + + org.lionsoul + ip2region + 1.7.2 + compile + + + org.springframework + spring-web + + + com.atlassian.commonmark + commonmark + 0.15.2 + compile + + + org.springframework + spring-context-support + + + com.sun.mail + jakarta.mail + + + org.thymeleaf + thymeleaf + + + org.springframework.data + spring-data-redis + + + + \ No newline at end of file diff --git a/framework/common/src/main/java/com/itmingchen/common/annotation/api/AccessLimit.java b/framework/common/src/main/java/com/itmingchen/common/annotation/api/AccessLimit.java new file mode 100644 index 0000000..529db6a --- /dev/null +++ b/framework/common/src/main/java/com/itmingchen/common/annotation/api/AccessLimit.java @@ -0,0 +1,29 @@ +package com.itmingchen.common.annotation.api; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * @Description: 访问控制 + * @Date: 2024-04-04 + */ +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +public @interface AccessLimit { + /** + * 限制周期(秒) + */ + int seconds(); + + /** + * 规定周期内限制次数 + */ + int maxCount(); + + /** + * 触发限制时的消息提示 + */ + String msg() default "操作频率过高"; +} \ No newline at end of file diff --git a/framework/common/src/main/java/com/itmingchen/common/annotation/api/OperationLogger.java b/framework/common/src/main/java/com/itmingchen/common/annotation/api/OperationLogger.java new file mode 100644 index 0000000..0ae65f1 --- /dev/null +++ b/framework/common/src/main/java/com/itmingchen/common/annotation/api/OperationLogger.java @@ -0,0 +1,19 @@ +package com.itmingchen.common.annotation.api; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * @Description: 用于需要记录操作日志的方法 + * @Date: 2024-11-29 + */ +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +public @interface OperationLogger { + /** + * 操作描述 + */ + String value() default ""; +} diff --git a/framework/common/src/main/java/com/itmingchen/common/annotation/api/VisitLogger.java b/framework/common/src/main/java/com/itmingchen/common/annotation/api/VisitLogger.java new file mode 100644 index 0000000..f1ebf23 --- /dev/null +++ b/framework/common/src/main/java/com/itmingchen/common/annotation/api/VisitLogger.java @@ -0,0 +1,24 @@ +package com.itmingchen.common.annotation.api; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * @Description: 用于需要记录访客访问日志的方法 + * @Date: 2024-12-04 + */ +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +public @interface VisitLogger { + /** + * 访问行为 + */ + String behavior() default ""; + + /** + * 访问内容 + */ + String content() default ""; +} diff --git a/framework/common/src/main/java/com/itmingchen/common/aspect/api/ExceptionLogAspect.java b/framework/common/src/main/java/com/itmingchen/common/aspect/api/ExceptionLogAspect.java new file mode 100644 index 0000000..6de5ed3 --- /dev/null +++ b/framework/common/src/main/java/com/itmingchen/common/aspect/api/ExceptionLogAspect.java @@ -0,0 +1,37 @@ +package com.itmingchen.common.aspect.api; + +import com.itmingchen.common.annotation.api.OperationLogger; +import com.itmingchen.common.annotation.api.VisitLogger; +import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.reflect.MethodSignature; +import org.springframework.stereotype.Component; + +import java.lang.reflect.Method; + +/** + * @Description: AOP记录异常日志 + * @Date: 2024-12-03 + */ +@Component +@Aspect +public class ExceptionLogAspect { + + + + private String getDescriptionFromAnnotations(JoinPoint joinPoint) { + String description = ""; + Method method = ((MethodSignature) joinPoint.getSignature()).getMethod(); + OperationLogger operationLogger = method.getAnnotation(OperationLogger.class); + if (operationLogger != null) { + description = operationLogger.value(); + return description; + } + VisitLogger visitLogger = method.getAnnotation(VisitLogger.class); + if (visitLogger != null) { + description = visitLogger.behavior(); + return description; + } + return description; + } +} \ No newline at end of file diff --git a/framework/common/src/main/java/com/itmingchen/common/aspect/api/OperationLogAspect.java b/framework/common/src/main/java/com/itmingchen/common/aspect/api/OperationLogAspect.java new file mode 100644 index 0000000..933c7e4 --- /dev/null +++ b/framework/common/src/main/java/com/itmingchen/common/aspect/api/OperationLogAspect.java @@ -0,0 +1,27 @@ +package com.itmingchen.common.aspect.api; + +import com.itmingchen.common.annotation.api.OperationLogger; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Pointcut; +import org.springframework.stereotype.Component; + +/** + * @Description: AOP记录操作日志 + * @Date: 2024-11-29 + */ +@Component +@Aspect +public class OperationLogAspect { + + + ThreadLocal currentTime = new ThreadLocal<>(); + + /** + * 配置切入点 + */ + @Pointcut("@annotation(operationLogger)") + public void logPointcut(OperationLogger operationLogger) { + } + + +} \ No newline at end of file diff --git a/framework/common/src/main/java/com/itmingchen/common/constants/other/CommonRedisConstants.java b/framework/common/src/main/java/com/itmingchen/common/constants/other/CommonRedisConstants.java new file mode 100644 index 0000000..168839c --- /dev/null +++ b/framework/common/src/main/java/com/itmingchen/common/constants/other/CommonRedisConstants.java @@ -0,0 +1,11 @@ +package com.itmingchen.common.constants.other; + +public class CommonRedisConstants { + + public static class RedisKey { + /** + * 手机短信验证码, + */ + public static final String VERIFY_CODE = "PHONE:CODE:VERIFY_CODE_%s_%s"; + } +} diff --git a/framework/common/src/main/java/com/itmingchen/common/constants/other/CommonStatusConstants.java b/framework/common/src/main/java/com/itmingchen/common/constants/other/CommonStatusConstants.java new file mode 100644 index 0000000..48c96e0 --- /dev/null +++ b/framework/common/src/main/java/com/itmingchen/common/constants/other/CommonStatusConstants.java @@ -0,0 +1,13 @@ +package com.itmingchen.common.constants.other; + +public class CommonStatusConstants { + /** + * 用户冻结 + */ + public static final int USER_STATUS_FREEZE = 1; + + /** + * 用户状态正常 + */ + public static final int USER_STATUS_NORMAL = 0; +} diff --git a/framework/common/src/main/java/com/itmingchen/common/constants/other/ErrorInfo.java b/framework/common/src/main/java/com/itmingchen/common/constants/other/ErrorInfo.java new file mode 100644 index 0000000..e27f6fb --- /dev/null +++ b/framework/common/src/main/java/com/itmingchen/common/constants/other/ErrorInfo.java @@ -0,0 +1,100 @@ +package com.itmingchen.common.constants.other; + +/** + * 通用异常信息,只放系统相关异常信息 + * + * @author itcast + */ +public class ErrorInfo { + public static class Msg { + public static final String PROCESS_FAILD = "失败"; + /** + * 请求异常默认异常信息 + */ + public static final String REQUEST_PARAM_ILLEGAL = "请求参数不合法"; + /** + * 频繁请求 + */ + public static final String REQUEST_OPERATE_FREQUENTLY = "操作频繁,请稍后重试"; + /** + * 请求超时 + */ + public static final String REQUEST_TIME_OUT = "请求超时"; + + /** + * 请求失败 + */ + public static final String REQUEST_FAILD = "请求失败"; + + public static final String REQUEST_FORBIDDEN = "拒绝访问"; + + public static final String REQUEST_UNAUTHORIZED = "身份未识别"; + + public static final String NO_PERMISSIONS = "无访问权限"; + + public static final String FORBIDDEN_OPERATION = "禁止操作"; + } + + public static class Code { + + /** + * 未登录 + */ + public static final int NOT_LOGIN = 600; + + /** + * 登录过期 + */ + public static final int LOGIN_TIMEOUT = 601; + + /** + * token不合法 + */ + public static final int ILLEGAL_TOKEN = 602; + + /** + * 无权限访问 + */ + public static final int NO_PERMISSIONS = 603; + + /** + * 禁止操作 + */ + public static final int FORBIDDEN_OPERATION = 604; + + /** + * 账号冻结 + */ + public static final int ACCOUNT_FREEZED = 605; + + /** + * 派单拒单 + */ + public static final int DISPATCH_REJECT = 606; + + /** + * 机构/服务端取消订单失败 + */ + public static final int ORDERS_CANCEL = 607; + + /** + * 抢单失败 + */ + public static final int SEIZE_ORDERS_FAILD = 608; + + /** + * 交易失败 + */ + public static final int TRADE_FAILED = 609; + + /** + * 对接评价系统http请求失败 + */ + public static final int HTTP_EVALUATION_FAILED = 610; + + /** + * 抢券失败 + */ + public static final int SEIZE_COUPON_FAILD = 611; + } +} diff --git a/framework/common/src/main/java/com/itmingchen/common/constants/other/HeaderConstants.java b/framework/common/src/main/java/com/itmingchen/common/constants/other/HeaderConstants.java new file mode 100644 index 0000000..7b39d06 --- /dev/null +++ b/framework/common/src/main/java/com/itmingchen/common/constants/other/HeaderConstants.java @@ -0,0 +1,51 @@ +package com.itmingchen.common.constants.other; + +/** + * 请求/响应header常量 + */ +public class HeaderConstants { + /** + * 当前用户信息 + */ + public static final String USER_INFO = "USER-INFO"; + + /** + * 当前用户类型 + */ + public static final String USER_TYPE = "USER-TYPE"; + + /** + * 异常捕获标识位 + */ + public static final String EXCEPTION_CATCH_FLAG = "EXCEPTION-CATCH-FLAG"; + + /** + * 异常标识 1 - 未见异常 + */ + public static final String EXCEPTION_CATCH_FLAG_1 = "1"; + /** + * 异常标识 2 - 异常 + */ + public static final String EXCEPTION_CATCH_FLAG_2 = "2"; + + + /** + * 请求id + */ + public static final String REQUEST_ID = "REQUEST-ID"; + + /** + * 请求来源标识,1:外界访问,2:内部访问 + */ + public static final String REQUEST_ORIGIN_FLAG = "REQUEST-ORIGIN-FLAG"; + + /** + * 访问来源标识 1: 外界访问 + */ + public static final String REQUEST_ORIGIN_FLAG_OUTSIDE = "1"; + + /** + * 访问来源标识 2:内部访问 + */ + public static final String REQUEST_ORIGIN_FLAG_INNER = "2"; +} diff --git a/framework/common/src/main/java/com/itmingchen/common/constants/other/MqConstants.java b/framework/common/src/main/java/com/itmingchen/common/constants/other/MqConstants.java new file mode 100644 index 0000000..8c8cf28 --- /dev/null +++ b/framework/common/src/main/java/com/itmingchen/common/constants/other/MqConstants.java @@ -0,0 +1,82 @@ +package com.itmingchen.common.constants.other; + +/** + * 静态变量 + * + * @author zzj + * @version 1.0 + */ +public interface MqConstants { + /** + * 默认延时时间为-1 + */ + int DEFAULT_DELAY = -1; + + /** + * 低延迟时间:5秒 + */ + int LOW_DELAY = 5000; + + /** + * 标准延迟时间:10秒 + */ + int NORMAL_DELAY = 10000; + + /** + * 延迟交换机关键字 + */ + String DELAYED_KEYWORD = "delayed"; + + /** + * 表明是延迟队列 + */ + String DELAYED = "true"; + + /** + * 定义消息交换机,约定:1:类型都为topic,2:延迟队列命名由.delayed结尾 + */ + interface Exchanges { + + /** + * 交易(支付) + */ + String TRADE = "itmingchen.exchange.topic.trade"; + + /** + * 评分 + */ + String EVALUATION_SCORE = "evaluation.score"; + } + + /** + * 定义消息队列 + */ + interface Queues { + + /** + * 订单微服务:更新支付状态 + */ + String ORDERS_TRADE_UPDATE_STATUS = "itmingchen.queue.orders.trade.update.Status"; + + /** + * 订单微服务:更新支付状态 + */ + String SCORE_STATISTICS = "itmingchen.queue.customer.score.statistics"; + } + + /** + * 定义路由key + */ + interface RoutingKeys { + + /** + * 更新支付状态 + */ + String TRADE_UPDATE_STATUS = "UPDATE_STATUS"; + + /** + * 分数统计 + */ + String SCORE_STATISTICS = "evaluation.score.statistics"; + } +} diff --git a/framework/common/src/main/java/com/itmingchen/common/constants/other/UserType.java b/framework/common/src/main/java/com/itmingchen/common/constants/other/UserType.java new file mode 100644 index 0000000..8415e2d --- /dev/null +++ b/framework/common/src/main/java/com/itmingchen/common/constants/other/UserType.java @@ -0,0 +1,28 @@ +package com.itmingchen.common.constants.other; + +public class UserType { + + /** + * c端用户 + */ + public static final int C_USER = 1; + + /** + * 服务人员 + */ + public static final int WORKER = 2; + + /** + * 机构人员 + */ + public static final int INSTITUTION = 3; + /** + * 运营人员 + */ + public static final int OPERATION = 4; + + /** + * 系统 + */ + public static final int SYSTEM = 0; +} diff --git a/framework/common/src/main/java/com/itmingchen/common/enums/EnableStatusEnum.java b/framework/common/src/main/java/com/itmingchen/common/enums/EnableStatusEnum.java new file mode 100644 index 0000000..790ccc4 --- /dev/null +++ b/framework/common/src/main/java/com/itmingchen/common/enums/EnableStatusEnum.java @@ -0,0 +1,20 @@ +package com.itmingchen.common.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@AllArgsConstructor +@Getter +public enum EnableStatusEnum { + UNKNOWAL(-1,"未知"),ENABLE(1,"启用"),DISABLE(0, "禁用"); + private int status; + private String description; + + public boolean equals(Integer status) { + return this.status == status; + } + + public boolean equals(EnableStatusEnum enableStatusEnum) { + return enableStatusEnum != null && enableStatusEnum.status == this.getStatus(); + } +} diff --git a/framework/common/src/main/java/com/itmingchen/common/enums/SmsBussinessTypeEnum.java b/framework/common/src/main/java/com/itmingchen/common/enums/SmsBussinessTypeEnum.java new file mode 100644 index 0000000..366e494 --- /dev/null +++ b/framework/common/src/main/java/com/itmingchen/common/enums/SmsBussinessTypeEnum.java @@ -0,0 +1,12 @@ +package com.itmingchen.common.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@AllArgsConstructor +@Getter +public enum SmsBussinessTypeEnum { + INSTITION_REGISTER(1), INSTITUTION_RESET_PASSWORD(2), SERVE_STAFF_LOGIN(3); + + private int type; +} diff --git a/framework/common/src/main/java/com/itmingchen/common/expcetions/BadRequestException.java b/framework/common/src/main/java/com/itmingchen/common/expcetions/BadRequestException.java new file mode 100644 index 0000000..3445890 --- /dev/null +++ b/framework/common/src/main/java/com/itmingchen/common/expcetions/BadRequestException.java @@ -0,0 +1,32 @@ +package com.itmingchen.common.expcetions; + +import static com.itmingchen.common.constants.other.ErrorInfo.Msg.REQUEST_FAILD; +import static java.net.HttpURLConnection.HTTP_BAD_REQUEST; + +/** + * 请求异常, + * 使用场景:请求参数不合法,频繁请求 + * + * @author itcast + */ +public class BadRequestException extends CommonException { + + public BadRequestException() { + this(REQUEST_FAILD); + } + + public BadRequestException(String message) { + super(HTTP_BAD_REQUEST, message); + } + + public BadRequestException(Throwable throwable, String message) { + super(throwable, HTTP_BAD_REQUEST, message); + } + + public BadRequestException(Throwable throwable) { + super(throwable, HTTP_BAD_REQUEST, REQUEST_FAILD); + } +} + + + diff --git a/framework/common/src/main/java/com/itmingchen/common/expcetions/CommonException.java b/framework/common/src/main/java/com/itmingchen/common/expcetions/CommonException.java new file mode 100644 index 0000000..c8a7f35 --- /dev/null +++ b/framework/common/src/main/java/com/itmingchen/common/expcetions/CommonException.java @@ -0,0 +1,36 @@ +package com.itmingchen.common.expcetions; + +import cn.hutool.http.HttpStatus; +import com.itmingchen.common.constants.other.ErrorInfo; +import lombok.Data; + +import static java.net.HttpURLConnection.HTTP_BAD_REQUEST; + +/** + * @author itcast + */ +@Data +public class CommonException extends RuntimeException { + private int code; + private String message; + + public CommonException() { + this.code = HTTP_BAD_REQUEST; + this.message = ErrorInfo.Msg.PROCESS_FAILD; + } + + public CommonException(int code, String message) { + this.code = code; + this.message = message; + } + + public CommonException(Throwable throwable, int code, String message) { + this.code = code; + this.message = message; + } + + public CommonException(String message) { + this(HttpStatus.HTTP_INTERNAL_ERROR, message); + } + +} diff --git a/framework/common/src/main/java/com/itmingchen/common/expcetions/DBException.java b/framework/common/src/main/java/com/itmingchen/common/expcetions/DBException.java new file mode 100644 index 0000000..bb3f934 --- /dev/null +++ b/framework/common/src/main/java/com/itmingchen/common/expcetions/DBException.java @@ -0,0 +1,26 @@ +package com.itmingchen.common.expcetions; + + +import static com.itmingchen.common.constants.other.ErrorInfo.Msg.PROCESS_FAILD; +import static java.net.HttpURLConnection.HTTP_SERVER_ERROR; + +/** + * @author itcast + */ +public class DBException extends CommonException { + public DBException() { + super(HTTP_SERVER_ERROR, PROCESS_FAILD); + } + + public DBException( String message) { + super(HTTP_SERVER_ERROR, message); + } + + public DBException(Throwable throwable, String message) { + super(throwable, HTTP_SERVER_ERROR, message); + } + + public DBException(Throwable throwable) { + super(throwable, HTTP_SERVER_ERROR, PROCESS_FAILD); + } +} diff --git a/framework/common/src/main/java/com/itmingchen/common/expcetions/ElasticSearchException.java b/framework/common/src/main/java/com/itmingchen/common/expcetions/ElasticSearchException.java new file mode 100644 index 0000000..e59626d --- /dev/null +++ b/framework/common/src/main/java/com/itmingchen/common/expcetions/ElasticSearchException.java @@ -0,0 +1,21 @@ +package com.itmingchen.common.expcetions; + +/** + * @author itcast + */ +public class ElasticSearchException extends CommonException { + public ElasticSearchException() { + } + + public ElasticSearchException(int code, String message) { + super(code, message); + } + + public ElasticSearchException(Throwable throwable, int code, String message) { + super(throwable, code, message); + } + + public ElasticSearchException(String message) { + super(message); + } +} diff --git a/framework/common/src/main/java/com/itmingchen/common/expcetions/ErrorRequestException.java b/framework/common/src/main/java/com/itmingchen/common/expcetions/ErrorRequestException.java new file mode 100644 index 0000000..688e12d --- /dev/null +++ b/framework/common/src/main/java/com/itmingchen/common/expcetions/ErrorRequestException.java @@ -0,0 +1,19 @@ +package com.itmingchen.common.expcetions; + +/** + * @Description: 非法请求异常 + * @Date: 2024-07-23 + */ + +public class ErrorRequestException extends RuntimeException { + public ErrorRequestException() { + } + + public ErrorRequestException(String message) { + super(message); + } + + public ErrorRequestException(String message, Throwable cause) { + super(message, cause); + } +} diff --git a/framework/common/src/main/java/com/itmingchen/common/expcetions/ForbiddenOperationException.java b/framework/common/src/main/java/com/itmingchen/common/expcetions/ForbiddenOperationException.java new file mode 100644 index 0000000..75d614a --- /dev/null +++ b/framework/common/src/main/java/com/itmingchen/common/expcetions/ForbiddenOperationException.java @@ -0,0 +1,28 @@ +package com.itmingchen.common.expcetions; + +import com.itmingchen.common.constants.other.ErrorInfo; + +/** + * 禁止操作异常 + * + * @author itheima + */ +public class ForbiddenOperationException extends CommonException { + + public ForbiddenOperationException() { + this(ErrorInfo.Msg.FORBIDDEN_OPERATION); + } + + public ForbiddenOperationException(String message) { + super(ErrorInfo.Code.FORBIDDEN_OPERATION, message); + } + + public ForbiddenOperationException(Throwable throwable, String message) { + super(throwable, ErrorInfo.Code.FORBIDDEN_OPERATION, message); + } + + public ForbiddenOperationException(Throwable throwable) { + super(throwable, ErrorInfo.Code.FORBIDDEN_OPERATION, ErrorInfo.Msg.FORBIDDEN_OPERATION); + } + +} diff --git a/framework/common/src/main/java/com/itmingchen/common/expcetions/MqException.java b/framework/common/src/main/java/com/itmingchen/common/expcetions/MqException.java new file mode 100644 index 0000000..3c3ebd2 --- /dev/null +++ b/framework/common/src/main/java/com/itmingchen/common/expcetions/MqException.java @@ -0,0 +1,31 @@ +package com.itmingchen.common.expcetions; + +import lombok.Data; + +/** + * @author itcast + */ +@Data +public class MqException extends CommonException{ + + /** + * mq失败消息 + */ + private String msg; + private Long mqId; + + public MqException() { + } + + public MqException(int code, String message) { + super(code, message); + } + + public MqException(Throwable throwable, int code, String message) { + super(throwable, code, message); + } + + public MqException(String message) { + super(message); + } +} diff --git a/framework/common/src/main/java/com/itmingchen/common/expcetions/NotFoundException.java b/framework/common/src/main/java/com/itmingchen/common/expcetions/NotFoundException.java new file mode 100644 index 0000000..c50a4fb --- /dev/null +++ b/framework/common/src/main/java/com/itmingchen/common/expcetions/NotFoundException.java @@ -0,0 +1,19 @@ +package com.itmingchen.common.expcetions; + +/** + * @Description: 404异常 + * @Date: 2024-08-14 + */ + +public class NotFoundException extends RuntimeException { + public NotFoundException() { + } + + public NotFoundException(String message) { + super(message); + } + + public NotFoundException(String message, Throwable cause) { + super(message, cause); + } +} diff --git a/framework/common/src/main/java/com/itmingchen/common/expcetions/PersistenceException.java b/framework/common/src/main/java/com/itmingchen/common/expcetions/PersistenceException.java new file mode 100644 index 0000000..487c577 --- /dev/null +++ b/framework/common/src/main/java/com/itmingchen/common/expcetions/PersistenceException.java @@ -0,0 +1,19 @@ +package com.itmingchen.common.expcetions; + +/** + * @Description: 持久化异常 + * @Date: 2024-08-14 + */ + +public class PersistenceException extends RuntimeException { + public PersistenceException() { + } + + public PersistenceException(String message) { + super(message); + } + + public PersistenceException(String message, Throwable cause) { + super(message, cause); + } +} diff --git a/framework/common/src/main/java/com/itmingchen/common/expcetions/RequestForbiddenException.java b/framework/common/src/main/java/com/itmingchen/common/expcetions/RequestForbiddenException.java new file mode 100644 index 0000000..96f3cac --- /dev/null +++ b/framework/common/src/main/java/com/itmingchen/common/expcetions/RequestForbiddenException.java @@ -0,0 +1,29 @@ +package com.itmingchen.common.expcetions; + +import static com.itmingchen.common.constants.other.ErrorInfo.Msg.REQUEST_FORBIDDEN; +import static java.net.HttpURLConnection.HTTP_FORBIDDEN; + +/** + * 权限校验被拒 + * + * @author itheima + */ +public class RequestForbiddenException extends CommonException{ + + public RequestForbiddenException() { + this(REQUEST_FORBIDDEN); + } + + public RequestForbiddenException(String message) { + super(HTTP_FORBIDDEN, message); + } + + public RequestForbiddenException(Throwable throwable, String message) { + super(throwable, HTTP_FORBIDDEN, message); + } + + public RequestForbiddenException(Throwable throwable) { + super(throwable, HTTP_FORBIDDEN, REQUEST_FORBIDDEN); + } + +} diff --git a/framework/common/src/main/java/com/itmingchen/common/expcetions/RequestTimeoutException.java b/framework/common/src/main/java/com/itmingchen/common/expcetions/RequestTimeoutException.java new file mode 100644 index 0000000..fb98830 --- /dev/null +++ b/framework/common/src/main/java/com/itmingchen/common/expcetions/RequestTimeoutException.java @@ -0,0 +1,29 @@ +package com.itmingchen.common.expcetions; + +import static com.itmingchen.common.constants.other.ErrorInfo.Msg.REQUEST_TIME_OUT; +import static java.net.HttpURLConnection.HTTP_CLIENT_TIMEOUT; + +/** + * 请求超时异常 + * + * @author itheima + */ +public class RequestTimeoutException extends CommonException { + + public RequestTimeoutException() { + this(REQUEST_TIME_OUT); + } + + public RequestTimeoutException(String message) { + super(HTTP_CLIENT_TIMEOUT, message); + } + + public RequestTimeoutException(Throwable throwable, String message) { + super(throwable, HTTP_CLIENT_TIMEOUT, message); + } + + public RequestTimeoutException(Throwable throwable) { + super(throwable, HTTP_CLIENT_TIMEOUT, REQUEST_TIME_OUT); + } + +} diff --git a/framework/common/src/main/java/com/itmingchen/common/expcetions/RequestUnauthorizedException.java b/framework/common/src/main/java/com/itmingchen/common/expcetions/RequestUnauthorizedException.java new file mode 100644 index 0000000..587ea2a --- /dev/null +++ b/framework/common/src/main/java/com/itmingchen/common/expcetions/RequestUnauthorizedException.java @@ -0,0 +1,30 @@ +package com.itmingchen.common.expcetions; + +import static com.itmingchen.common.constants.other.ErrorInfo.Msg.REQUEST_UNAUTHORIZED; +import static java.net.HttpURLConnection.HTTP_UNAUTHORIZED; + +/** + * 身份校验异常,错误码401 + * 使用场景:网关校验token,token不合法或token过期 + * + * @author itheima + */ +public class RequestUnauthorizedException extends CommonException { + + public RequestUnauthorizedException() { + this(REQUEST_UNAUTHORIZED); + } + + public RequestUnauthorizedException(String message) { + super(HTTP_UNAUTHORIZED, message); + } + + public RequestUnauthorizedException(Throwable throwable, String message) { + super(throwable, HTTP_UNAUTHORIZED, message); + } + public RequestUnauthorizedException(Throwable throwable) { + super(throwable, HTTP_UNAUTHORIZED, REQUEST_UNAUTHORIZED); + } + + +} diff --git a/framework/common/src/main/java/com/itmingchen/common/expcetions/ServerErrorException.java b/framework/common/src/main/java/com/itmingchen/common/expcetions/ServerErrorException.java new file mode 100644 index 0000000..432b98a --- /dev/null +++ b/framework/common/src/main/java/com/itmingchen/common/expcetions/ServerErrorException.java @@ -0,0 +1,29 @@ +package com.itmingchen.common.expcetions; + +import static com.itmingchen.common.constants.other.ErrorInfo.Msg.PROCESS_FAILD; +import static java.net.HttpURLConnection.HTTP_SERVER_ERROR; + +/** + * 服务器异常 + * + * @author itcast + */ +public class ServerErrorException extends CommonException { + + public ServerErrorException() { + this(PROCESS_FAILD); + } + + public ServerErrorException(String message) { + super(HTTP_SERVER_ERROR, message); + } + + public ServerErrorException(Throwable throwable, String message) { + super(throwable, HTTP_SERVER_ERROR, message); + } + + public ServerErrorException(Throwable throwable) { + super(throwable, HTTP_SERVER_ERROR, PROCESS_FAILD); + } + +} diff --git a/framework/common/src/main/java/com/itmingchen/common/expcetions/ServerUnavailableException.java b/framework/common/src/main/java/com/itmingchen/common/expcetions/ServerUnavailableException.java new file mode 100644 index 0000000..afa06ec --- /dev/null +++ b/framework/common/src/main/java/com/itmingchen/common/expcetions/ServerUnavailableException.java @@ -0,0 +1,27 @@ +package com.itmingchen.common.expcetions; + +import static com.itmingchen.common.constants.other.ErrorInfo.Msg.PROCESS_FAILD; +import static java.net.HttpURLConnection.HTTP_UNAVAILABLE; + +/** + * 服务不可用,注册中心找不到对应服务 + * + * @author itcast + */ +public class ServerUnavailableException extends CommonException { + public ServerUnavailableException() { + this(PROCESS_FAILD); + } + + public ServerUnavailableException(String message) { + super(HTTP_UNAVAILABLE, message); + } + + public ServerUnavailableException(Throwable throwable, String message) { + super(throwable, HTTP_UNAVAILABLE, message); + } + + public ServerUnavailableException(Throwable throwable) { + super(throwable, HTTP_UNAVAILABLE, PROCESS_FAILD); + } +} diff --git a/framework/common/src/main/java/com/itmingchen/common/expcetions/StartException.java b/framework/common/src/main/java/com/itmingchen/common/expcetions/StartException.java new file mode 100644 index 0000000..4ab0692 --- /dev/null +++ b/framework/common/src/main/java/com/itmingchen/common/expcetions/StartException.java @@ -0,0 +1,12 @@ +package com.itmingchen.common.expcetions; + +/** + * 应用启动异常 + * @author itcast + */ +public class StartException extends CommonException{ + + public StartException(String message) { + super(message); + } +} diff --git a/framework/common/src/main/java/com/itmingchen/common/handler/ConvertHandler.java b/framework/common/src/main/java/com/itmingchen/common/handler/ConvertHandler.java new file mode 100644 index 0000000..6d2ad6c --- /dev/null +++ b/framework/common/src/main/java/com/itmingchen/common/handler/ConvertHandler.java @@ -0,0 +1,14 @@ +package com.itmingchen.common.handler; + +/** + * 特殊类型转换器 + */ +public interface ConvertHandler { + /** + * 特殊对象类型转换 + * + * @param originObject 源对象 + * @param targetObject 目标对象 + */ + void map(O originObject, T targetObject); +} diff --git a/framework/common/src/main/java/com/itmingchen/common/handler/RequestIdHandler.java b/framework/common/src/main/java/com/itmingchen/common/handler/RequestIdHandler.java new file mode 100644 index 0000000..24c2496 --- /dev/null +++ b/framework/common/src/main/java/com/itmingchen/common/handler/RequestIdHandler.java @@ -0,0 +1,9 @@ +package com.itmingchen.common.handler; + +/** + * 请求id获取 + */ +public interface RequestIdHandler { + + String getRequestId(); +} diff --git a/framework/common/src/main/java/com/itmingchen/common/handler/UserInfoHandler.java b/framework/common/src/main/java/com/itmingchen/common/handler/UserInfoHandler.java new file mode 100644 index 0000000..01baac7 --- /dev/null +++ b/framework/common/src/main/java/com/itmingchen/common/handler/UserInfoHandler.java @@ -0,0 +1,8 @@ +package com.itmingchen.common.handler; + +import com.itmingchen.common.model.CurrentUserInfo; + +public interface UserInfoHandler { + + CurrentUserInfo currentUserInfo(); +} diff --git a/framework/common/src/main/java/com/itmingchen/common/model/CurrentUserInfo.java b/framework/common/src/main/java/com/itmingchen/common/model/CurrentUserInfo.java new file mode 100644 index 0000000..70abd26 --- /dev/null +++ b/framework/common/src/main/java/com/itmingchen/common/model/CurrentUserInfo.java @@ -0,0 +1,25 @@ +package com.itmingchen.common.model; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +/** + * 当前用户信息 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +public class CurrentUserInfo implements Serializable { + /** + * 当前用户id + */ + private Long id; + /** + * 用户名/昵称 + */ + private String email; + +} diff --git a/framework/common/src/main/java/com/itmingchen/common/model/Location.java b/framework/common/src/main/java/com/itmingchen/common/model/Location.java new file mode 100644 index 0000000..facbb77 --- /dev/null +++ b/framework/common/src/main/java/com/itmingchen/common/model/Location.java @@ -0,0 +1,24 @@ +package com.itmingchen.common.model; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * 经纬度 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +public class Location { + /** + * 经度 + */ + private Double lon; + + /** + * 纬度 + */ + private Double lat; + +} diff --git a/framework/common/src/main/java/com/itmingchen/common/model/PageResult.java b/framework/common/src/main/java/com/itmingchen/common/model/PageResult.java new file mode 100644 index 0000000..d25eb18 --- /dev/null +++ b/framework/common/src/main/java/com/itmingchen/common/model/PageResult.java @@ -0,0 +1,119 @@ +package com.itmingchen.common.model; + +import cn.hutool.core.collection.CollUtil; +import com.itmingchen.common.expcetions.CommonException; +import com.itmingchen.common.handler.ConvertHandler; +import com.itmingchen.common.utils.BeanUtils; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Optional; + +@ApiModel(value = "分页数据消息体", description = "分页数据统一对象") +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class PageResult { + /** + * 总页数 + */ + @ApiModelProperty(value = "总页数", required = true) + private Long pages = 0L; + + /** + * 总条数 + */ + @ApiModelProperty(value = "总条数", required = true) + private Long total; + + /** + * 数据列表 + */ + @ApiModelProperty(value = "数据列表", required = true) + private List list = Collections.EMPTY_LIST; + + + /** + * 返回一个分页对象实例 + * + * @return 分页数据对象 + */ + public static PageResult getInstance() { + return PageResult.builder().build(); + } + + + /** + * 对items进行类型转换 + * + * @param origin 源分页数据对象 + * @param clazz 指定items 属性的类型,不能为null + * @return 目标分页数据对象 + */ + public static PageResult of(PageResult origin, Class clazz) { + return of(origin, clazz, null); + } + + /** + * 对items进行类型转换 + * + * @param origin 源分页数据对象 + * @param clazz 指定items 属性的类型,不能为null + * @param convertHandler 特殊对象类型转换器,可传null,即不进行特殊处理 + * @return 目标分页数据对象 + */ + public static PageResult of(PageResult origin, Class clazz, ConvertHandler convertHandler) { + //断言目标转换类型不为null + if (null == clazz) { + throw new CommonException("目标转换类型不能为null!"); + } + + //复制除items外的属性 + PageResult target = PageResult.getInstance(); + BeanUtils.copyProperties(origin, target, "items"); + + //items为空,直接返回 + if (CollUtil.isEmpty(origin.getList())) { + return target; + } + + //对items进行类型转换 + List targetList = BeanUtils.copyToList(origin.getList(), clazz, convertHandler); + target.setList(targetList); + + //封装分页数据 + return target; + } + + /** + * List{@link List}封装为分页数据对象 + * + * @param list item数据 + * @param pages 页尺寸,可不传,数据不为空时默认为1 + * @param total 总条数 + * @return 目标分页数据对象 + */ + public static PageResult of(List list, Integer pageSize, Long pages, Long total) { + PageResult pageResult = PageResult.builder().pages(Optional.ofNullable(pages).orElse(0L)) + .total(Optional.ofNullable(total).orElse(0L)).build(); + + + if (CollUtil.isEmpty(list)) { + pageResult.setList(new ArrayList()); + return pageResult; + } + + pageResult.setList(list); + return pageResult; + } + + +} diff --git a/framework/common/src/main/java/com/itmingchen/common/model/Result.java b/framework/common/src/main/java/com/itmingchen/common/model/Result.java new file mode 100644 index 0000000..46c67f2 --- /dev/null +++ b/framework/common/src/main/java/com/itmingchen/common/model/Result.java @@ -0,0 +1,79 @@ +package com.itmingchen.common.model; + +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.http.HttpStatus; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.nio.charset.StandardCharsets; + +@Data +public class Result { + + public static final int SUCCESS = 200; + public static final String OK = "OK"; + public static final int FAILED = 1; + + public static final byte[] OK_BYTES = + String.format("{\"code\":%d,\"msg\":\"%s\",\"data\": {}}", SUCCESS, OK).getBytes(StandardCharsets.UTF_8); + public static final byte[] OK_PREFIX = + String.format("{\"code\":%d,\"msg\":\"%s\",\"data\": ", SUCCESS, OK).getBytes(StandardCharsets.UTF_8); + public static final byte[] OK_SUFFIX = "}".getBytes(StandardCharsets.UTF_8); + public static final byte[] OK_STR_PREFIX = + String.format("{\"code\":%d,\"msg\":\"%s\",\"data\":", SUCCESS, OK).getBytes(StandardCharsets.UTF_8); + public static final byte[] OK_STR_SUFFIX = "}".getBytes(StandardCharsets.UTF_8); + public static final String REQUEST_OK = "OK"; + + @ApiModelProperty(value = "业务状态码,200-成功,其它-失败") + private int code; + @ApiModelProperty(value = "响应消息", example = "OK") + private String msg; + @ApiModelProperty(value = "响应数据") + private T data; + @ApiModelProperty(value = "请求id", example = "1af123c11412e") + private String requestId; + + public static Result ok() { + return new Result(HttpStatus.HTTP_OK, REQUEST_OK, null); + } + + public static Result ok(T data) { + return new Result<>(HttpStatus.HTTP_OK, REQUEST_OK, data); + } + + public static Result error(String msg) { + return new Result<>(HttpStatus.HTTP_BAD_REQUEST, msg, null); + } + + public static Result error(int code, String msg) { + return new Result<>(code, msg, null); + } + + public Result() { + } + + public Result(int code, String msg, T data) { + this.code = code; + this.msg = msg; + this.data = data; + } + + public boolean success() { + return code == HttpStatus.HTTP_OK; + } + + public static byte[] plainOk() { + return OK_BYTES; + } + + public static byte[] plainOk(byte[] data) { + if(data == null || data.length <= 0){ + return OK_BYTES; + } + byte b = data[0]; + if (b == 91 || b == 123) { + return ArrayUtil.addAll(OK_PREFIX, data, OK_SUFFIX); + } + return ArrayUtil.addAll(OK_STR_PREFIX, data, OK_STR_SUFFIX); + } +} diff --git a/framework/common/src/main/java/com/itmingchen/common/model/dto/PageQueryDTO.java b/framework/common/src/main/java/com/itmingchen/common/model/dto/PageQueryDTO.java new file mode 100644 index 0000000..b1e75d6 --- /dev/null +++ b/framework/common/src/main/java/com/itmingchen/common/model/dto/PageQueryDTO.java @@ -0,0 +1,39 @@ +package com.itmingchen.common.model.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.Getter; + +@Data +@ApiModel("分页查询数据") +public class PageQueryDTO { + @ApiModelProperty("页码数") + private Long pageNo=1L; + @ApiModelProperty("每页条数") + private Long pageSize=10L; + @ApiModelProperty("排序字段1") + private String orderBy1; + @ApiModelProperty("排序字段1是否升序") + private Boolean isAsc1 = false; + + @ApiModelProperty("排序字段2,排序顺序排在排序字段1后边,如果排序字段1未设置,该字段也可以排序") + private String orderBy2; + @ApiModelProperty("排序字段2是否升序") + private Boolean isAsc2 = false; + + /** + * 计算起始条数 + * @return + */ + public Long calFrom() { + return pageNo.intValue() * pageSize.intValue() * 1L; + } + @AllArgsConstructor + @Getter + public static class OrderBy { + private String orderBy; + private Boolean isAsc; + } +} diff --git a/framework/common/src/main/java/com/itmingchen/common/model/dto/StorageUploadResDTO.java b/framework/common/src/main/java/com/itmingchen/common/model/dto/StorageUploadResDTO.java new file mode 100644 index 0000000..6848a99 --- /dev/null +++ b/framework/common/src/main/java/com/itmingchen/common/model/dto/StorageUploadResDTO.java @@ -0,0 +1,21 @@ +package com.itmingchen.common.model.dto; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * 文件上传响应值 + * + * @author itcast + * @create 2023/7/6 15:29 + **/ +@Data +@AllArgsConstructor +@NoArgsConstructor +public class StorageUploadResDTO { + /** + * 文件地址 + */ + private String url; +} \ No newline at end of file diff --git a/framework/common/src/main/java/com/itmingchen/common/model/msg/TradeStatusMsg.java b/framework/common/src/main/java/com/itmingchen/common/model/msg/TradeStatusMsg.java new file mode 100644 index 0000000..e6c76ce --- /dev/null +++ b/framework/common/src/main/java/com/itmingchen/common/model/msg/TradeStatusMsg.java @@ -0,0 +1,72 @@ +package com.itmingchen.common.model.msg; + +import cn.hutool.json.JSONUtil; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; + +/** + * 交易状态消息 + * + * @author itcast + */ +@Data +@SuperBuilder +@NoArgsConstructor +@AllArgsConstructor +public class TradeStatusMsg { + + /** + * 交易单号 + */ + private Long tradingOrderNo; + + /** + * 业务系统标识 + */ + private String productAppId; + /** + * 订单号 + */ + private Long productOrderNo; + + /** + * 第三方支付的交易号 + */ + private String transactionId; + + /** + * 支付渠道 + */ + private String tradingChannel; + + /** + * 退款单号 + */ + private Long refundNo; + + /** + * 支付/退款 状态名称 + */ + private String statusName; + + /** + * 支付/退款 状态编码 + */ + private Integer statusCode; + + /** + * 扩展信息 + */ + private String info; + + /** + * 创建时间 + */ + private Long created; + + public String toJson() { + return JSONUtil.toJsonStr(this); + } +} diff --git a/framework/common/src/main/java/com/itmingchen/common/utils/AopUtils.java b/framework/common/src/main/java/com/itmingchen/common/utils/AopUtils.java new file mode 100644 index 0000000..2216002 --- /dev/null +++ b/framework/common/src/main/java/com/itmingchen/common/utils/AopUtils.java @@ -0,0 +1,44 @@ +package com.itmingchen.common.utils; + +import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.reflect.MethodSignature; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.util.LinkedHashMap; +import java.util.Map; + +/** + * @Description: AOP工具类 + * @Date: 2024-12-02 + */ +public class AopUtils { + /** + * 获取请求参数 + * + * @param joinPoint + * @return + */ + public static Map getRequestParams(JoinPoint joinPoint) { + Map map = new LinkedHashMap<>(); + String[] parameterNames = ((MethodSignature) joinPoint.getSignature()).getParameterNames(); + Object[] args = joinPoint.getArgs(); + for (int i = 0; i < args.length; i++) { + if (!isFilterObject(args[i])) { + map.put(parameterNames[i], args[i]); + } + } + return map; + } + + /** + * consider if the data is file, httpRequest or response + * + * @param o the data + * @return if match return true, else return false + */ + private static boolean isFilterObject(final Object o) { + return o instanceof HttpServletRequest || o instanceof HttpServletResponse || o instanceof MultipartFile; + } +} diff --git a/framework/common/src/main/java/com/itmingchen/common/utils/ArrayUtils.java b/framework/common/src/main/java/com/itmingchen/common/utils/ArrayUtils.java new file mode 100644 index 0000000..7b81ade --- /dev/null +++ b/framework/common/src/main/java/com/itmingchen/common/utils/ArrayUtils.java @@ -0,0 +1,53 @@ +package com.itmingchen.common.utils; + +import cn.hutool.core.util.ArrayUtil; +import com.itmingchen.common.handler.ConvertHandler; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 数组工具类 + * @ClassName ArrayUtils + * @author itheima + * @since 2022/7/10 12:02 + * @version 1.0.0 + **/ +public class ArrayUtils extends ArrayUtil { + + /** + * 将源数组转换成指定类型的列表 + * + * @param originList 原始列表 + * @param targetClazz 转换后列表元素的类型 + * @param 原始列表元素的类型 + * @param 目标列表元素的类型 + * @return 目标类型的集合 + */ + public static List convert(R[] originList, Class targetClazz) { + return convert(originList, targetClazz, null); + + } + + /** + * 将源数组转换成指定类型的列表 + * + * @param originList 原始列表 + * @param targetClazz 转换后列表元素的类型 + * @param convert 转换特殊字段接口 + * @param 原始列表元素的类型 + * @param 目标列表元素的类型 + * @return 目标类型的集合 + */ + public static List convert(R[] originList, Class targetClazz, ConvertHandler convert) { + if (isEmpty(originList)) { + return null; + } + + return Arrays.stream(originList) + .map(origin -> BeanUtils.copyBean(origin, targetClazz, convert)) + .collect(Collectors.toList()); + + } +} diff --git a/framework/common/src/main/java/com/itmingchen/common/utils/AspectUtils.java b/framework/common/src/main/java/com/itmingchen/common/utils/AspectUtils.java new file mode 100644 index 0000000..cd8f5e2 --- /dev/null +++ b/framework/common/src/main/java/com/itmingchen/common/utils/AspectUtils.java @@ -0,0 +1,66 @@ +package com.itmingchen.common.utils; + +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.Signature; +import org.aspectj.lang.reflect.MethodSignature; +import org.springframework.core.LocalVariableTableParameterNameDiscoverer; + +import java.lang.reflect.Method; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +/** + * @author itcast + */ +public class AspectUtils { + + /** + * 获取被拦截方法对象 + * MethodSignature.getMethod() 获取的是顶层接口或者父类的方法对象 + * 所以应该使用反射获取当前对象的方法对象 + */ + public static Method getMethod(ProceedingJoinPoint pjp) { + //获取参数的类型 + Signature sig = pjp.getSignature(); + if (sig instanceof MethodSignature) { + MethodSignature methodSignature = (MethodSignature) sig; + return methodSignature.getMethod(); + } else { + throw new IllegalArgumentException("It's not method"); + } + } + + /** + * 在aop切面中SPEL表达式对formatter进行格式化, + * 转换出指定的值 + * + * @param formatter + * @param method + * @param args + * @return + */ + public static String parse(String formatter, Method method, Object[] args) { + if(formatter == null || formatter.indexOf("{") < 0){ + return formatter; + } + LocalVariableTableParameterNameDiscoverer nameDiscoverer = new LocalVariableTableParameterNameDiscoverer(); + return SpelUtils.parse(formatter, nameDiscoverer.getParameterNames(method), args); + } + + /** + * 在aop切面中批量SPEL表达式对formatter进行格式化, + * @param formatters + * @param method + * @param args + * @return + */ + public static List parseList(String[] formatters, Method method, Object[] args) { + if (ArrayUtils.isEmpty(formatters)) { + return null; + } + return Arrays.stream(formatters) + .map(formatter -> AspectUtils.parse(formatter, method, args)) + .collect(Collectors.toList()); + } +} diff --git a/framework/common/src/main/java/com/itmingchen/common/utils/AssertUtils.java b/framework/common/src/main/java/com/itmingchen/common/utils/AssertUtils.java new file mode 100644 index 0000000..b20cc7f --- /dev/null +++ b/framework/common/src/main/java/com/itmingchen/common/utils/AssertUtils.java @@ -0,0 +1,156 @@ +package com.itmingchen.common.utils; + +import com.itmingchen.common.constants.other.ErrorInfo; +import com.itmingchen.common.expcetions.BadRequestException; + +import java.util.Map; + +/** + * 断言工具类,符合条件不会抛出异常,不符合条件则会抛出异常 + * + * @author itheima + */ +public class AssertUtils { + /** + * 两个对象相同,不同则会抛出异常 + * + * @param obj1 duixiang1 + * @param obj2 对象2 + * @param message 异常信息 + */ + public static void equals(Object obj1, Object obj2, String... message) { + if (obj1 == null || obj2 == null) { + handleException(message); + return; + } + if (obj1 == obj2) { + return; + } + if (!obj1.equals(obj2)) { + handleException(message); + } + } + + /** + * 判断对象不为null,为null抛出异常 + * + * @param obj 判断对象 + * @param message 异常信息 + */ + public static void isNotNull(Object obj, String... message) { + if (obj == null) { + handleException(message); + } + } + + /** + * 判断字符串不为空,为空抛出异常 + * + * @param str 判空字符串 + * @param message 异常信息 + */ + public static void isNotBlank(String str, String... message) { + if (StringUtils.isBlank(str)) { + handleException(message); + } + } + + /** + * 判断boolean对象是否为真,为真不抛出异常 + * + * @param boo boolean对象 + * @param message 异常信息 + */ + public static void isTrue(Boolean boo, String... message) { + if (!BooleanUtils.isTrue(boo)) { + handleException(message); + } + } + + /** + * 判断集合是否不为空,为空抛出异常 + * + * @param coll 判空集合对象 + * @param message 异常信息 + */ + public static void isNotEmpty(Iterable coll, String... message) { + if (CollUtils.isEmpty(coll)) { + handleException(message); + } + } + + /** + * 判断map是否不为空,为空抛出异常 + * + * @param map 判不为空map + * @param message 异常信息 + */ + public static void isNotEmpty(Map map, String... message) { + if (CollUtils.isEmpty(map)) { + handleException(message); + } + } + + + /** + * 判断boolean对象是否为假,为假则不抛出异常 + * + * @param boo boolean对象 + * @param message 异常信息 + */ + public static void isFalse(Boolean boo, String... message) { + if (!BooleanUtils.isFalse(boo)) { + handleException(message); + } + } + + /** + * 判断一个值是否是指定值中的一个,没有匹配到抛出异常信息 + * + * @param t 需要比较的数据 + * @param message 抛出异常信息 + * @param targets 比较集合 + * @param 比较数据类型 + */ + public static void in(T t,String message, T ... targets) { + for (T target : targets) { + if(t.equals(target)) { + return; + } + } + // 没有匹配到抛出指定信息 + handleException(message); + } + + /** + * 判断一个值是否是指定值不被包含在集合中,没有匹配到抛出异常信息 + * + * @param t 需要比较的数据 + * @param message 抛出异常信息 + * @param targets 比较集合中 + * @param 比较数据类型 + */ + public static void notIn(T t,String message, T ... targets) { + for (T target : targets) { + if(t.equals(target)) { + // 信息被匹配到抛出异常信息 + handleException(message); + } + } + + } + /** + * 异常信息处理 + * + * @param message 异常信息 + */ + private static void handleException(String... message) { + String msg = ErrorInfo.Msg.REQUEST_PARAM_ILLEGAL; + if (message != null && message.length > 0) { + msg = message[0]; + } + throw new BadRequestException(msg); + } + + +} diff --git a/framework/common/src/main/java/com/itmingchen/common/utils/Base64Utils.java b/framework/common/src/main/java/com/itmingchen/common/utils/Base64Utils.java new file mode 100644 index 0000000..7bd1d13 --- /dev/null +++ b/framework/common/src/main/java/com/itmingchen/common/utils/Base64Utils.java @@ -0,0 +1,33 @@ +package com.itmingchen.common.utils; + +import java.nio.charset.StandardCharsets; +import java.util.Base64; + +/** + * @author itcast + */ +public class Base64Utils { + + /** + * 字符串编码 + * + * @param content + * @return + */ + public static byte[] encode(String content) { + if (null == content) { + return "".getBytes(); + } + return Base64.getEncoder().encode(content.getBytes(StandardCharsets.UTF_8)); + } + + public static String encodeStr(String content) { + return new String(encode(content), StandardCharsets.UTF_8); + } + + public static String decodeStr(String content) { + return new String(Base64.getDecoder().decode(content.getBytes(StandardCharsets.UTF_8))); + } + + +} diff --git a/framework/common/src/main/java/com/itmingchen/common/utils/BeanUtils.java b/framework/common/src/main/java/com/itmingchen/common/utils/BeanUtils.java new file mode 100644 index 0000000..eee8737 --- /dev/null +++ b/framework/common/src/main/java/com/itmingchen/common/utils/BeanUtils.java @@ -0,0 +1,140 @@ +package com.itmingchen.common.utils; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.bean.copier.CopyOptions; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjectUtil; +import com.itmingchen.common.handler.ConvertHandler; + +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; + +/** + * 继承自 hutool 的BeanUtil,增加了bean转换时自定义转换器的功能 + * + * @author itcast + */ +public class BeanUtils extends BeanUtil { + + /** + * 将原对象转换成目标对象,对于字段不匹配的字段可以使用转换器处理 + * + * @param source 原对象 + * @param clazz 目标对象的class + * @param convertHandler 转换器 + * @param 原对象类型 + * @param 目标对象类型 + * @return 目标对象 + */ + public static T copyBean(O source, Class clazz, ConvertHandler convertHandler) { + T target = copyBean(source, clazz); + if (convertHandler != null) { + convertHandler.map(source, target); + } + return target; + } + + /** + * 复制set集合中的属性到目标对象中 + * + * @param originSet 原始对象集合 + * @param targetType 目标对象类型 + * @param convertHandler 目标对象数据转换器 + * @return + * @param 原始对象类型 + * @param 目标对象类型 + */ + public static List copyToList(Set originSet, Class targetType, ConvertHandler convertHandler) { + if (CollUtils.isEmpty(originSet)) { + return null; + } + return originSet.stream().map(o -> copyBean(o, targetType, convertHandler)).collect(Collectors.toList()); + } + + /** + * 复制set集合中的属性到目标对象中 + * + * @param originSet 原始对象集合 + * @param targetType 目标对象类型 + * @return + * @param 原始对象类型 + * @param 目标对象类型 + */ + public static List copyToList(Set originSet, Class targetType) { + return copyToList(originSet, targetType, (ConvertHandler) null); + } + + /** + * 复制集合中的Bean属性 + * + * @param originList 原Bean集合 + * @param targetType 目标Bean类型 + * @param convertHandler 特殊对象类型转换器,可传null,即不进行特殊处理 + * @return 复制后的List + */ + public static List copyToList(List originList, Class targetType, ConvertHandler convertHandler) { + List targetList = cn.hutool.core.bean.BeanUtil.copyToList(originList, targetType); + //特殊类型转换 + if (CollUtil.isNotEmpty(targetList) && ObjectUtil.isNotEmpty(convertHandler)) { + for (int i = 0; i < originList.size(); i++) { + convertHandler.map(originList.get(i), targetList.get(i)); + } + } + return targetList; + } + + /** + * 将原对象转换成目标对象,对于字段不匹配的字段可以使用转换器处理 + * + * @param source 原对象 + * @param clazz 目标对象的class + * @param 原对象类型 + * @param 目标对象类型 + * @return 目标对象 + */ + public static T copyBean(R source, Class clazz) { + if (source == null) { + return null; + } + return toBean(source, clazz); + } + + /** + * 将列表转换另一种类型的列表 + * + * @param originList 原列表 + * @param targetClass 目标类型class + * @param 原列表元素类型 + * @param 目标列表元素类型 + * @return 目标列表 + */ + @Deprecated + public static List copyList(List originList, Class targetClass) { + if (CollUtils.isEmpty(originList)) { + return CollUtils.emptyList(); + } + return copyToList(originList, targetClass); + } + + @Deprecated + public static List copyList(List list, Class clazz, ConvertHandler convertHandler) { + if (list == null || list.size() == 0) { + return CollUtils.emptyList(); + } + return list.stream().map(r -> copyBean(r, clazz, convertHandler)).collect(Collectors.toList()); + } + + public static T copyIgnoreNull(T source,T target, Class clazz){ + //1.源数据和目标数据都转为map + Map oldData = BeanUtil.beanToMap(target,false,true); + Map newData = BeanUtil.beanToMap(source,false,true); + + //2.用新数据覆盖旧数据 + oldData.putAll(newData); + + //3.map转为bean返回 + return BeanUtil.mapToBean(oldData, clazz, false, new CopyOptions()); + } +} \ No newline at end of file diff --git a/framework/common/src/main/java/com/itmingchen/common/utils/BooleanUtils.java b/framework/common/src/main/java/com/itmingchen/common/utils/BooleanUtils.java new file mode 100644 index 0000000..d1d2d47 --- /dev/null +++ b/framework/common/src/main/java/com/itmingchen/common/utils/BooleanUtils.java @@ -0,0 +1,6 @@ +package com.itmingchen.common.utils; + +import cn.hutool.core.util.BooleanUtil; + +public class BooleanUtils extends BooleanUtil { +} diff --git a/framework/common/src/main/java/com/itmingchen/common/utils/ByteUtils.java b/framework/common/src/main/java/com/itmingchen/common/utils/ByteUtils.java new file mode 100644 index 0000000..d4b7d53 --- /dev/null +++ b/framework/common/src/main/java/com/itmingchen/common/utils/ByteUtils.java @@ -0,0 +1,18 @@ +package com.itmingchen.common.utils; + +import cn.hutool.core.util.ByteUtil; + +public class ByteUtils extends ByteUtil { + + /** + * 将byte[] 数组转换成字符串,如果为空返回 "" + * @param content 字节内容 + * @return 字符串值 + */ + public static String parse(byte[] content){ + if(content == null || content.length <= 0) { + return StringUtils.EMPTY; + } + return new String(content); + } +} diff --git a/framework/common/src/main/java/com/itmingchen/common/utils/ClassUtils.java b/framework/common/src/main/java/com/itmingchen/common/utils/ClassUtils.java new file mode 100644 index 0000000..ad340fb --- /dev/null +++ b/framework/common/src/main/java/com/itmingchen/common/utils/ClassUtils.java @@ -0,0 +1,9 @@ +package com.itmingchen.common.utils; + +import cn.hutool.core.util.ClassUtil; + +import java.lang.annotation.Annotation; + +public class ClassUtils extends ClassUtil { + +} diff --git a/framework/common/src/main/java/com/itmingchen/common/utils/CollUtils.java b/framework/common/src/main/java/com/itmingchen/common/utils/CollUtils.java new file mode 100644 index 0000000..0742695 --- /dev/null +++ b/framework/common/src/main/java/com/itmingchen/common/utils/CollUtils.java @@ -0,0 +1,199 @@ +package com.itmingchen.common.utils; + +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.collection.IterUtil; + +import java.util.*; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.function.Function; +import java.util.stream.Collectors; + +/** + * 继承自 hutool 的集合工具类 + */ +public class CollUtils extends CollectionUtil { + + public static List emptyList() { + return Collections.emptyList(); + } + + public static Set emptySet() { + return Collections.emptySet(); + } + + public static Map emptyMap() { + return Collections.emptyMap(); + } + + public static Set singletonSet(T t) { + return Collections.singleton(t); + } + + public static List singletonList(T t) { + return Collections.singletonList(t); + } + + public static List convertToInteger(List originList) { + return CollUtils.isNotEmpty(originList) ? originList.stream().map(NumberUtils::parseInt).collect(Collectors.toList()) : null; + } + + public static List convertToLong(List originLIst) { + return CollUtils.isNotEmpty(originLIst) ? originLIst.stream().map(NumberUtils::parseLong).collect(Collectors.toList()) : null; + } + + /** + * 以 conjunction 为分隔符将集合转换为字符串 如果集合元素为数组、Iterable或Iterator,则递归组合其为字符串 + * + * @param collection 集合 + * @param conjunction 分隔符 + * @param 集合元素类型 + * @return 连接后的字符串 + * See Also: IterUtil.join(Iterator, CharSequence) + */ + public static String join(Collection collection, CharSequence conjunction) { + if (null == collection || collection.isEmpty()) { + return null; + } + return IterUtil.join(collection.iterator(), conjunction); + } + + public static String joinIgnoreNull(Collection collection, CharSequence conjunction) { + if (null == collection || collection.isEmpty()) { + return null; + } + StringBuilder sb = new StringBuilder(); + for (T t : collection) { + if (t == null) continue; + sb.append(t).append(","); + } + if (sb.length() <= 0) { + return null; + } + return sb.deleteCharAt(sb.length() - 1).toString(); + } + + /** + * 将元素加入到集合中,为null的过滤掉 + * + * @param list 集合 + * @param data 要添加的数据 + * @param 元素类型 + */ + public static void add(Collection list, T... data) { + if (list == null || ArrayUtils.isEmpty(data)) { + return; + } + for (T t : data) { + if (ObjectUtils.isNotEmpty(t)) { + list.add(t); + } + } + } + + //将两个集合出现次数相加 + public static Map union(Map map1, Map map2) { + if (CollUtils.isEmpty(map1)) { + return map2; + } else if (CollUtils.isEmpty(map2)) { + return map1; + } + for (Map.Entry entry : map1.entrySet()) { + Integer num = map2.get(entry.getKey()); + map2.put(entry.getKey(), NumberUtils.null2Zero(num) + entry.getValue()); + } + return map2; + } + + public static R getFiledOfFirst(List list, Function function) { + if (CollUtils.isEmpty(list)) { + return null; + } + return function.apply(list.get(0)); + } + + /** + * 将枚举集合表转换成列表 + * @param enumeration 枚举集合 + * @return 列表 + * @param 元素类型 + */ + public static List toList(Enumeration enumeration) { + if (!enumeration.hasMoreElements()) { + return new ArrayList<>(); + } + List data = new ArrayList<>(); + T current = null; + while ((current = enumeration.nextElement()) != null) { + data.add(current); + } + return data; + } + + /** + * 获取数组为空的序号列表 + * + * @param list + * @return + */ + public static List getIndexsOfNullData(List list) { + if (isEmpty(list)) { + return null; + } + AtomicInteger counter = new AtomicInteger(0); + // filter 中的过滤条件不能调换,和表达式的执行顺序有关系 + return list.stream().filter(x -> counter.incrementAndGet() >= 0 && x == null) + .map(x -> Integer.valueOf(counter.intValue() - 1)) + .collect(Collectors.toList()); + } + + public static List valueofIndexs(List list, List indexs) { + if(CollUtils.isEmpty(indexs) || CollUtils.isEmpty(list)){ + return null; + } + + return indexs.stream() + .map(index -> list.get(index)) + .collect(Collectors.toList()); + } + + /** + * 获取集合中某一列的值集合 + * + * @param list + * @param function + * @return + * @param + * @param + */ + public static List getFieldValues(List list, Function function) { + if(isEmpty(list)){ + return null; + } + return list.stream().map(function) + .collect(Collectors.toList()); + } + + /** + * 将两个列表合并出第三个列表 + * @param list1 + * @param list2 + * @return + * @param + */ + public static List union(List list1, List list2) { + if(isEmpty(list1)) { + return list2; + } + if(isEmpty(list2)){ + return list1; + } + List result = new ArrayList<>(); + result.addAll(list1); + result.addAll(list2); + return result; + } + + public static Map defaultIfEmpty(Map originMap, Map defaultMap) { + return CollUtils.isEmpty(originMap) ? defaultMap : originMap; + } +} \ No newline at end of file diff --git a/framework/common/src/main/java/com/itmingchen/common/utils/ComparatorUtils.java b/framework/common/src/main/java/com/itmingchen/common/utils/ComparatorUtils.java new file mode 100644 index 0000000..700ae1b --- /dev/null +++ b/framework/common/src/main/java/com/itmingchen/common/utils/ComparatorUtils.java @@ -0,0 +1,72 @@ +package com.itmingchen.common.utils; + +import java.io.Serializable; +import java.util.Comparator; +import java.util.Objects; +import java.util.function.Function; + +/** + * 原始比较器无法处理空值问题,特写此工具类 + */ +public class ComparatorUtils { + + + /** + * 比较器,可以将空值元素移动到头部 + * + * @param keyExtractor + * @param + * @param + * @return + */ + public static > Comparator nullToFirstComparing(Function keyExtractor) { + return nullComparing(true, keyExtractor); + } + + /** + * 比较器,可以将空值元素移动到尾部 + * + * @param keyExtractor + * @param + * @param + * @return + */ + public static > Comparator nullToLastComparing(Function keyExtractor) { + return nullComparing(false, keyExtractor); + } + + /** + * 比较器,可以处理空值元素,将空值元素移动到头部或尾部 + * + * @param nullFirst 空元素是否排到头部 + * @return 比较器 + */ + public static > Comparator nullComparing(boolean nullFirst, + Function keyExtractor) { + Objects.requireNonNull(keyExtractor); + + return (Comparator & Serializable) + (c1, c2) -> { + boolean c1NUll = ObjectUtils.isNull(c1) || ObjectUtils.isNull(keyExtractor.apply(c1)); + boolean c2NUll = ObjectUtils.isNull(c2) || ObjectUtils.isNull(keyExtractor.apply(c2)); + + if (c1NUll) { + return c2NUll ? 0 : (nullFirst ? -1 : 1); + } else if (c2NUll) { + return nullFirst ? 1 : -1; + } + return keyExtractor.apply(c1).compareTo(keyExtractor.apply(c2)); + }; + } + + /** + * 判断comparator是否反转过 + * + * @param comparator + * @return + */ + public static boolean isAsc(Comparator comparator) { + Objects.requireNonNull(comparator); + return !comparator.getClass().getName().contains("ReverseComparator"); + } +} diff --git a/framework/common/src/main/java/com/itmingchen/common/utils/DateUtils.java b/framework/common/src/main/java/com/itmingchen/common/utils/DateUtils.java new file mode 100644 index 0000000..86d3b9a --- /dev/null +++ b/framework/common/src/main/java/com/itmingchen/common/utils/DateUtils.java @@ -0,0 +1,226 @@ +package com.itmingchen.common.utils; + +import cn.hutool.core.date.LocalDateTimeUtil; + +import java.time.*; +import java.time.format.DateTimeFormatter; +import java.util.*; + +/** + * 时间工具类,用于本地时间操作,包含LocalDateTimeUtil的所有方法和自定义的LocalDateTime的操作方法及常量 + * + * @author itheima + * @version 1.0.0 1.0 + * @see 1.0 + * @since 从哪个版本开始支持该类的功能 + */ +public class DateUtils extends LocalDateTimeUtil { + + public static final String DEFAULT_YEAR_FORMAT = "yyyy"; + public static final String DEFAULT_MONTH_FORMAT = "yyyy-MM"; + public static final String DEFAULT_MONTH_FORMAT_SLASH = "yyyy/MM"; + public static final String DEFAULT_MONTH_FORMAT_EN = "yyyy年MM月"; + public static final String DEFAULT_MONTH_FORMAT_COMPACT = "yyyyMM"; + public static final String DEFAULT_WEEK_FORMAT = "yyyy-ww"; + public static final String DEFAULT_WEEK_FORMAT_EN = "yyyy年ww周"; + public static final String DEFAULT_DATE_FORMAT = "yyyy-MM-dd"; + public static final String DEFAULT_DATE_FORMAT_EN = "yyyy年MM月dd日"; + public static final String DEFAULT_DATE_FORMAT_COMPACT = "yyyyMMdd"; + public static final String DEFAULT_DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss"; + public static final String DEFAULT_DATE_TIME_COMPACT = "yyyyMMddHHmmss"; + public static final String DEFAULT_TIME_FORMAT = "HH:mm:ss"; + public static final String DATE_HOUR_FORMAT = "ddHH"; + public static final String DAY = "DAY"; + public static final String MONTH = "MONTH"; + public static final String WEEK = "WEEK"; + public static final long MAX_MONTH_DAY = 30L; + public static final long MAX_3_MONTH_DAY = 90L; + public static final long MAX_YEAR_DAY = 365L; + + + public static final DateTimeFormatter SIGN_DATE_SUFFIX_FORMATTER = + DateTimeFormatter.ofPattern(":yyyyMM"); + public static final DateTimeFormatter POINTS_BOARD_SUFFIX_FORMATTER = + DateTimeFormatter.ofPattern("yyyyMM"); + + public static final String TIME_ZONE_8 = "GMT+8"; + + /** + * 获取utc时间 + * + * @param localDateTime 转化时间 + * @return utc时间 + */ + public static LocalDateTime getUTCTime(LocalDateTime localDateTime) { + ZoneId australia = ZoneId.of("Asia/Shanghai"); + ZonedDateTime dateAndTimeInSydney = ZonedDateTime.of(localDateTime, australia); + ZonedDateTime utcDate = dateAndTimeInSydney.withZoneSameInstant(ZoneOffset.UTC); + return utcDate.toLocalDateTime(); + } + + /** + * 获取Asia时间 + * + * @param localDateTime 转化时间 + * @return Asia时间 + */ + public static LocalDateTime getAsiaTime(LocalDateTime localDateTime) { + ZoneId australia = ZoneId.of("Asia/Shanghai"); + ZonedDateTime dateAndTimeInSydney = ZonedDateTime.of(localDateTime, ZoneOffset.UTC); + ZonedDateTime utcDate = dateAndTimeInSydney.withZoneSameInstant(australia); + return utcDate.toLocalDateTime(); + } + + /** + * 获取某一天的开始:0点0分 + * + * @param localDateTime 指定日期 + * @return 转换后的时间 + */ + public static LocalDateTime getDayStartTime(LocalDateTime localDateTime) { + if (localDateTime == null) { + return null; + } + return localDateTime.toLocalDate().atStartOfDay(); + } + + /** + * 获取某一天的结束:23点 59分 59秒的时间 + * + * @param localDateTime 指定日期 + * @return 转换后的时间 + */ + public static LocalDateTime getDayEndTime(LocalDateTime localDateTime) { + if (localDateTime == null) { + return null; + } + return LocalDateTime.of(localDateTime.toLocalDate(), LocalTime.MAX); + } + + public static Date addDays(int i) { + Calendar c = Calendar.getInstance(TimeZone.getTimeZone(TIME_ZONE_8)); + c.add(Calendar.DAY_OF_MONTH, i); + return c.getTime(); + } + + + public static LocalDate getMonthBegin(LocalDate date) { + return LocalDate.of(date.getYear(), date.getMonth(), 1); + } + + public static LocalDate getMonthEnd(LocalDate date) { + return LocalDate.of(date.getYear(), date.getMonthValue() + 1, 1).minusDays(1); + } + + public static LocalDateTime getMonthBeginTime(LocalDate date) { + return LocalDate.of(date.getYear(), date.getMonth(), 1).atStartOfDay(); + } + + public static LocalDateTime getMonthEndTime(LocalDate date) { + return LocalDate.of(date.getYear(), date.getMonthValue() + 1, 1) + .minusDays(1).atTime(LocalTime.MAX); + } + + public static LocalDateTime getWeekBeginTime(LocalDate now) { + return now.minusDays(now.getDayOfWeek().getValue() - 1).atStartOfDay(); + } + + public static LocalDateTime getWeekEndTime(LocalDate now) { + return LocalDateTime.of(now.plusDays(8 - now.getDayOfWeek().getValue()), LocalTime.MAX); + } + + /** + * 获取最近15天日期(不包含当天),格式MM.dd + * + * @return + */ + public static List last15Day() { + // 1.定义日期列表 + List days = new ArrayList<>(); + // 2.获取15天前的时间 + LocalDateTime time = now().minusDays(15); + // 3.for循环遍历 + for (int count = 0; count < 15; count++) { + // 3.1.格式化时间 + days.add(String.format("%s.%s", + NumberUtils.repair0(time.getMonthValue(), 2), NumberUtils.repair0(time.getDayOfMonth(), 2))); + // 3.2.日期加1天 + time = time.plusDays(1); + } + // 4.返回结果 + return days; + } + + /** + * 获取当前时间s + * + * @return + */ + public static int getCurrentTime() { + return (int) (System.currentTimeMillis() / 1000); + } + + public static int getDay() { + return getDay(null); + } + + public static int getDay(LocalDateTime localDateTime) { + if (localDateTime == null) { + localDateTime = now(); + } + String format = format(localDateTime, DEFAULT_DATE_FORMAT_COMPACT); + return NumberUtils.parseInt(format); + } + + /** + * 获取数字格式的日志 + * + * @param localDateTime 日期 + * @param format 格式模板,只支持纯数字模板 + * @return + */ + public static Long getFormatDate(LocalDateTime localDateTime, String format) { + String date = format(localDateTime, format); + return date == null ? null : NumberUtils.parseLong(date); + } + + /** + * 获取数字格式的日志 + * + * @param localDateTime 日期 + * @param format 格式模板,只支持纯数字模板 + * @return + */ + public static Integer getIntFormatDate(LocalDateTime localDateTime, String format) { + String date = format(localDateTime, format); + return date == null ? null : NumberUtils.parseInt(date); + } + + /** + * 获取最小的一个时间 + * @param localDateTimes + * @return + */ + public static LocalDateTime getMin(LocalDateTime... localDateTimes) { + if(localDateTimes == null || localDateTimes.length <= 0) { + return null; + } + if(localDateTimes.length == 1) { + return localDateTimes[0]; + } + List localDateTimeList = Arrays.asList(localDateTimes); + return localDateTimeList.stream().sorted().findFirst().orElse(null); + } + + public static LocalDateTime getMax(LocalDateTime ... localDateTimes) { + if(localDateTimes == null || localDateTimes.length <= 0) { + return null; + } + if(localDateTimes.length == 1) { + return localDateTimes[0]; + } + List localDateTimeList = Arrays.asList(localDateTimes); + return localDateTimeList.stream().sorted(Comparator.reverseOrder()).findFirst().orElse(null); + } + +} diff --git a/framework/common/src/main/java/com/itmingchen/common/utils/EnumUtils.java b/framework/common/src/main/java/com/itmingchen/common/utils/EnumUtils.java new file mode 100644 index 0000000..21f8fa9 --- /dev/null +++ b/framework/common/src/main/java/com/itmingchen/common/utils/EnumUtils.java @@ -0,0 +1,6 @@ +package com.itmingchen.common.utils; + +import cn.hutool.core.util.EnumUtil; + +public class EnumUtils extends EnumUtil { +} diff --git a/framework/common/src/main/java/com/itmingchen/common/utils/HashUtils.java b/framework/common/src/main/java/com/itmingchen/common/utils/HashUtils.java new file mode 100644 index 0000000..fea4e69 --- /dev/null +++ b/framework/common/src/main/java/com/itmingchen/common/utils/HashUtils.java @@ -0,0 +1,31 @@ +package com.itmingchen.common.utils; + +import org.apache.commons.codec.digest.MurmurHash3; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.util.DigestUtils; + +/** + * @Description: Hash工具类 + * @Date: 2024-11-17 + */ +public class HashUtils { + private static final BCryptPasswordEncoder bCryptPasswordEncoder = new BCryptPasswordEncoder(); + + public static String getMd5(CharSequence str) { + return DigestUtils.md5DigestAsHex(str.toString().getBytes()); + } + + public static long getMurmurHash32(String str) { + int i = MurmurHash3.hash32(str); + long num = i < 0 ? Integer.MAX_VALUE - (long) i : i; + return num; + } + + public static String getBC(CharSequence rawPassword) { + return bCryptPasswordEncoder.encode(rawPassword); + } + + public static boolean matchBC(CharSequence rawPassword, String encodedPassword) { + return bCryptPasswordEncoder.matches(rawPassword, encodedPassword); + } +} diff --git a/framework/common/src/main/java/com/itmingchen/common/utils/HttpUtils.java b/framework/common/src/main/java/com/itmingchen/common/utils/HttpUtils.java new file mode 100644 index 0000000..df7c29a --- /dev/null +++ b/framework/common/src/main/java/com/itmingchen/common/utils/HttpUtils.java @@ -0,0 +1,6 @@ +package com.itmingchen.common.utils; + +import cn.hutool.http.HttpUtil; + +public class HttpUtils extends HttpUtil { +} diff --git a/framework/common/src/main/java/com/itmingchen/common/utils/IdUtils.java b/framework/common/src/main/java/com/itmingchen/common/utils/IdUtils.java new file mode 100644 index 0000000..1d9a5e0 --- /dev/null +++ b/framework/common/src/main/java/com/itmingchen/common/utils/IdUtils.java @@ -0,0 +1,10 @@ +package com.itmingchen.common.utils; + +import cn.hutool.core.util.IdUtil; + +/** + * @author itcast + */ +public class IdUtils extends IdUtil { + public static final String ID = "id"; +} diff --git a/framework/common/src/main/java/com/itmingchen/common/utils/IoUtils.java b/framework/common/src/main/java/com/itmingchen/common/utils/IoUtils.java new file mode 100644 index 0000000..7590ab6 --- /dev/null +++ b/framework/common/src/main/java/com/itmingchen/common/utils/IoUtils.java @@ -0,0 +1,6 @@ +package com.itmingchen.common.utils; + +import cn.hutool.core.io.IoUtil; + +public class IoUtils extends IoUtil { +} diff --git a/framework/common/src/main/java/com/itmingchen/common/utils/IpAddressUtils.java b/framework/common/src/main/java/com/itmingchen/common/utils/IpAddressUtils.java new file mode 100644 index 0000000..9f9fda8 --- /dev/null +++ b/framework/common/src/main/java/com/itmingchen/common/utils/IpAddressUtils.java @@ -0,0 +1,109 @@ +package com.itmingchen.common.utils; + +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.lionsoul.ip2region.DataBlock; +import org.lionsoul.ip2region.DbConfig; +import org.lionsoul.ip2region.DbSearcher; +import org.lionsoul.ip2region.Util; +import org.springframework.core.io.ClassPathResource; +import org.springframework.stereotype.Component; +import org.springframework.util.FileCopyUtils; + +import javax.annotation.PostConstruct; +import javax.servlet.http.HttpServletRequest; +import java.io.InputStream; +import java.lang.reflect.Method; +import java.net.InetAddress; +import java.net.UnknownHostException; + +/** + * @Description: ip记录 + * @Date: 2024-08-18 + */ +@Slf4j +@Component +public class IpAddressUtils { + /** + * 在Nginx等代理之后获取用户真实IP地址 + * + * @param request + * @return + */ + public static String getIpAddress(HttpServletRequest request) { + String ip = request.getHeader("x-forwarded-for"); + if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { + ip = request.getHeader("Proxy-Client-IP"); + } + if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { + ip = request.getHeader("WL-Proxy-Client-IP"); + } + if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { + ip = request.getHeader("HTTP_CLIENT_IP"); + } + if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { + ip = request.getHeader("HTTP_X_FORWARDED_FOR"); + } + if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { + ip = request.getRemoteAddr(); + if ("127.0.0.1".equals(ip) || "0:0:0:0:0:0:0:1".equals(ip)) { + //根据网卡取本机配置的IP + InetAddress inet = null; + try { + inet = InetAddress.getLocalHost(); + } catch (UnknownHostException e) { + log.error("getIpAddress exception:", e); + } + ip = inet.getHostAddress(); + } + } + return StringUtils.substringBefore(ip, ","); + } + + private static DbSearcher searcher; + private static Method method; + + /** + * 在服务启动时加载 ip2region.db 到内存中 + * 解决打包jar后找不到 ip2region.db 的问题 + */ + @PostConstruct + private void initIp2regionResource() { + try { + InputStream inputStream = new ClassPathResource("/ipdb/ip2region.db").getInputStream(); + //将 ip2region.db 转为 ByteArray + byte[] dbBinStr = FileCopyUtils.copyToByteArray(inputStream); + DbConfig dbConfig = new DbConfig(); + searcher = new DbSearcher(dbConfig, dbBinStr); + //二进制方式初始化 DBSearcher,需要使用基于内存的查找算法 memorySearch + method = searcher.getClass().getMethod("memorySearch", String.class); + } catch (Exception e) { + log.error("initIp2regionResource exception:", e); + } + } + + /** + * 根据ip从 ip2region.db 中获取地理位置 + * + * @param ip + * @return + */ + public static String getCityInfo(String ip) { + if (ip == null || !Util.isIpAddress(ip)) { + log.error("Error: Invalid ip address"); + return null; + } + try { + DataBlock dataBlock = (DataBlock) method.invoke(searcher, ip); + String ipInfo = dataBlock.getRegion(); + if (!StringUtils.isEmpty(ipInfo)) { + ipInfo = ipInfo.replace("|0", ""); + ipInfo = ipInfo.replace("0|", ""); + } + return ipInfo; + } catch (Exception e) { + log.error("getCityInfo exception:", e); + } + return null; + } +} \ No newline at end of file diff --git a/framework/common/src/main/java/com/itmingchen/common/utils/JacksonUtils.java b/framework/common/src/main/java/com/itmingchen/common/utils/JacksonUtils.java new file mode 100644 index 0000000..4afdb07 --- /dev/null +++ b/framework/common/src/main/java/com/itmingchen/common/utils/JacksonUtils.java @@ -0,0 +1,56 @@ +package com.itmingchen.common.utils; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; + +import java.io.IOException; +import java.io.InputStream; + +/** + * @Description: Jackson Object Mapper + * @Date: 2024-11-07 + */ +public class JacksonUtils { + private static ObjectMapper objectMapper = new ObjectMapper(); + + public static String writeValueAsString(Object value) { + try { + return objectMapper.writeValueAsString(value); + } catch (JsonProcessingException e) { + e.printStackTrace(); + return ""; + } + } + + public static T readValue(String content, Class valueType) { + try { + return objectMapper.readValue(content, valueType); + } catch (IOException e) { + e.printStackTrace(); + return null; + } + } + + public static T readValue(String content, TypeReference valueTypeRef) { + try { + return objectMapper.readValue(content, valueTypeRef); + } catch (IOException e) { + e.printStackTrace(); + return null; + } + } + + public static T readValue(InputStream src, Class valueType) { + try { + return objectMapper.readValue(src, valueType); + } catch (IOException e) { + e.printStackTrace(); + return null; + } + } + + public static T convertValue(Object fromValue, Class toValueType) { + return objectMapper.convertValue(fromValue, toValueType); + } +} diff --git a/framework/common/src/main/java/com/itmingchen/common/utils/JsonUtils.java b/framework/common/src/main/java/com/itmingchen/common/utils/JsonUtils.java new file mode 100644 index 0000000..53ab128 --- /dev/null +++ b/framework/common/src/main/java/com/itmingchen/common/utils/JsonUtils.java @@ -0,0 +1,6 @@ +package com.itmingchen.common.utils; + +import cn.hutool.json.JSONUtil; + +public class JsonUtils extends JSONUtil { +} \ No newline at end of file diff --git a/framework/common/src/main/java/com/itmingchen/common/utils/JwtTool.java b/framework/common/src/main/java/com/itmingchen/common/utils/JwtTool.java new file mode 100644 index 0000000..8f04b95 --- /dev/null +++ b/framework/common/src/main/java/com/itmingchen/common/utils/JwtTool.java @@ -0,0 +1,113 @@ +package com.itmingchen.common.utils; + +import cn.hutool.jwt.JWT; +import com.itmingchen.common.model.CurrentUserInfo; +import io.jsonwebtoken.Claims; +import io.jsonwebtoken.Jwts; +import io.jsonwebtoken.SignatureAlgorithm; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.stereotype.Component; + +import java.nio.charset.Charset; +import java.time.Duration; +import java.util.Collection; +import java.util.Date; +@Component +public class JwtTool { + // 便于联调token有效期设置一个月 todo + private static final Duration JWT_TOKEN_TTL = Duration.ofMinutes(24 * 60 * 30); + private static final String PAYLOAD_USER_KEY = "user"; + + private static byte[] key; + + public JwtTool(String keyStr) { + key = keyStr.getBytes(); + } + + /** + * 创建 jwttoken + * + * @param currentUserId 用户id + * @param email 用户邮箱 + * @return jwt token + */ + public String createToken(Long currentUserId, String email) { + // 名称base64编码,防止token无法解析 + String encodeName = StringUtils.isEmpty(email) ? null : Base64Utils.encodeStr(email); + // 1.生成jws + return JWT.create() + .setPayload(PAYLOAD_USER_KEY, new CurrentUserInfo(currentUserId, encodeName)) + .setExpiresAt(new Date(System.currentTimeMillis() + JWT_TOKEN_TTL.toMillis())) + .setCharset(Charset.forName("UTF-8")) + .setKey(key) + .sign(); + } + + + /** + * 判断token是否存在 + * + * @param token + * @return + */ + public static boolean judgeTokenIsExist(String token) { + return token != null && !"".equals(token) && !"null".equals(token); + } + /** + * 获取tokenBody同时校验token是否有效(无效则会抛出异常) + * + * @param token + * @return + */ + public static Claims getTokenBody(String token) { + Claims claims = Jwts.parser().setSigningKey(key).parseClaimsJws(token.replace("Bearer", "")).getBody(); + return claims; + } + /** + * 从访问token中获取用户信息 + * + * @param token 访问token + * @return 用户信息 + */ + public CurrentUserInfo parseToken(String token) { + try { + JWT jwt = JWT.of(token) + .setKey(key); + Object payload = jwt.getPayload(PAYLOAD_USER_KEY); + return BeanUtils.isEmpty(payload) ? null : BeanUtils.copyBean(payload, CurrentUserInfo.class,((originObject, targetObject) -> { + // base64解码 + if(StringUtils.isNotEmpty(targetObject.getEmail())) { + targetObject.setEmail(Base64Utils.decodeStr(targetObject.getEmail())); + } + })); + } catch (Exception e) { + return null; + } + } + + /** + * 生成带角色权限的token + * + * @param subject + * @param authorities + * @return + */ + public static String generateToken(String subject, Collection authorities) { + StringBuilder sb = new StringBuilder(); + for (GrantedAuthority authority : authorities) { + sb.append(authority.getAuthority()).append(","); + } + String jwt = Jwts.builder() + .setSubject(subject) + .claim("authorities", sb) + .setExpiration(new Date(System.currentTimeMillis() + JWT_TOKEN_TTL.toMillis())) + .signWith(SignatureAlgorithm.HS512, key) + .compact(); + return jwt; + } + + + + + +} diff --git a/framework/common/src/main/java/com/itmingchen/common/utils/LambdaUtils.java b/framework/common/src/main/java/com/itmingchen/common/utils/LambdaUtils.java new file mode 100644 index 0000000..84745cf --- /dev/null +++ b/framework/common/src/main/java/com/itmingchen/common/utils/LambdaUtils.java @@ -0,0 +1,19 @@ +package com.itmingchen.common.utils; + +import cn.hutool.core.lang.func.Func1; +import cn.hutool.core.lang.func.LambdaUtil; + +public class LambdaUtils extends LambdaUtil { + + /** + * 获取lambda表达式Getter或Setter函数(方法)对应的字段名称,并转换成下划线格式,规则如下: + * getXxxx获取为xxxx,如getName得到name。 + * setXxxx获取为xxxx,如setName得到name。 + * isXxxx获取为xxxx,如isName得到name。 + * 其它不满足规则的方法名抛出IllegalArgumentException + */ + public static String getUnderLineFieldName(Func1 func) throws IllegalArgumentException { + String fieldName = getFieldName(func); + return StringUtils.isEmpty(fieldName) ? null : StringUtils.toUnderlineCase(fieldName); + } +} diff --git a/framework/common/src/main/java/com/itmingchen/common/utils/LocationUtils.java b/framework/common/src/main/java/com/itmingchen/common/utils/LocationUtils.java new file mode 100644 index 0000000..79da634 --- /dev/null +++ b/framework/common/src/main/java/com/itmingchen/common/utils/LocationUtils.java @@ -0,0 +1,50 @@ +package com.itmingchen.common.utils; + +/** + * 坐标相关工具类,处理经纬度 + */ +public class LocationUtils { + + + /** + * 反转经纬度 + * + * @param location + * @return + */ + public static String reversLatLon(String location) { + return reversLatLon(location, ","); + } + + /** + * 反转经纬度 + * + * @param location + * @return + */ + public static String reversLatLon(String location, String symbol) { + if (StringUtils.isEmpty(location) || StringUtils.isEmpty(symbol)) { + return location; + } + String[] locationSplit = location.split(symbol); + if (locationSplit.length != 2) { + return location; + } + return locationSplit[1] + symbol + locationSplit[0]; + } + + /** + * 数字经纬度返回字符串经纬度 + * + * @param lon + * @param lat + * @return + */ + public static String getLocation(Double lon, Double lat) { + if (lon == null || lat == null) { + return null; + } + return String.format("%s,%s", lon, lat); + } + +} diff --git a/framework/common/src/main/java/com/itmingchen/common/utils/MailUtils.java b/framework/common/src/main/java/com/itmingchen/common/utils/MailUtils.java new file mode 100644 index 0000000..61ae76c --- /dev/null +++ b/framework/common/src/main/java/com/itmingchen/common/utils/MailUtils.java @@ -0,0 +1,64 @@ +package com.itmingchen.common.utils; + +import com.itmingchen.common.expcetions.ErrorRequestException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.mail.MailProperties; +import org.springframework.mail.SimpleMailMessage; +import org.springframework.mail.javamail.JavaMailSender; +import org.springframework.mail.javamail.MimeMessageHelper; +import org.springframework.scheduling.annotation.Async; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.stereotype.Component; +import org.thymeleaf.TemplateEngine; +import org.thymeleaf.context.Context; + +import javax.mail.internet.MimeMessage; +import java.util.Map; + +/** + * @Description: 邮件工具类 + * @Date: 2024-10-10 + */ +@Component +@EnableAsync +public class MailUtils { + @Autowired + private JavaMailSender javaMailSender; + @Autowired + private MailProperties mailProperties; + @Autowired + TemplateEngine templateEngine; + + @Async + public void sendSimpleMail(String toAccount, String subject, String content) { + try { + SimpleMailMessage message = new SimpleMailMessage(); + message.setFrom(mailProperties.getUsername()); + message.setTo(toAccount); + message.setSubject(subject); + message.setText(content); + javaMailSender.send(message); + } catch (Exception e) { + e.printStackTrace(); + throw new ErrorRequestException("发送验证码失败"); + } + } + + @Async + public void sendHtmlTemplateMail(Map map, String toAccount, String subject, String template) { + try { + MimeMessage mimeMessage = javaMailSender.createMimeMessage(); + MimeMessageHelper messageHelper = new MimeMessageHelper(mimeMessage); + Context context = new Context(); + context.setVariables(map); + String process = templateEngine.process(template, context); + messageHelper.setFrom(mailProperties.getUsername()); + messageHelper.setTo(toAccount); + messageHelper.setSubject(subject); + messageHelper.setText(process, true); + javaMailSender.send(mimeMessage); + } catch (Exception e) { + e.printStackTrace(); + } + } +} diff --git a/framework/common/src/main/java/com/itmingchen/common/utils/NumberUtils.java b/framework/common/src/main/java/com/itmingchen/common/utils/NumberUtils.java new file mode 100644 index 0000000..fb201ba --- /dev/null +++ b/framework/common/src/main/java/com/itmingchen/common/utils/NumberUtils.java @@ -0,0 +1,151 @@ +package com.itmingchen.common.utils; + +import cn.hutool.core.util.NumberUtil; + +import java.math.BigDecimal; +import java.util.Comparator; +import java.util.List; +import java.util.stream.Collectors; + +public class NumberUtils extends NumberUtil { + + + /** + * 如果number为空,将number转换为0,否则原数字返回 + * + * @param number 原数值 + * @return 整型数字,0或原数字 + */ + public static Integer null2Zero(Integer number){ + return number == null ? 0 : number; + } + + /** + * 如果number为空,将number转换为0,否则原数字返回 + * + * @param number 原数值 + * @return 整型数字,0或原数字 + */ + public static Double null2Zero(Double number){ + return number == null ? 0 : number; + } + + /** + * 如果是空值,返回默认数据;如果有值直接返回 + * @param number + * @param defaultNumber + * @return + */ + public static double null2Default(Double number, double defaultNumber) { + return number == null ? defaultNumber : number; + } + + /** + * 如果number为空,将number转换为0L,否则原数字返回 + * + * @param number 原数值 + * @return 长整型数字,0L或原数字 + */ + public static Long null2Zero(Long number){ + return number == null ? 0L : number; + } + + + public static Double setScale(Double number) { + return new BigDecimal(number) + .setScale(2, BigDecimal.ROUND_HALF_UP) + .doubleValue(); + } + /** + * 比较两个数字是否相同, + * @param number1 数值1 + * @param number2 数值2 + * @return 是否一致 + */ + public static boolean equals(Integer number1, Integer number2) { + if(number1 == null || number2 == null){ + return false; + } + return number1.equals(number2); + } + + /** + * 数字除法保留指定小数位 + * @param num1 被除数 + * @param num2 除数 + * @param scale 小数点位数 + * @return 结果 + */ + public static Double divToDouble(Integer num1, Integer num2, int scale){ + if(num2 == null || num2 ==0 || num1 == null || num1 == 0) { + return 0d; + } + return div(num1, num2, scale).doubleValue(); + } + + public static Double max(List data){ + if(CollUtils.isEmpty(data)){ + return null; + } + return data.stream() + .max(Comparator.comparingDouble(num -> num)) + .orElse(0d); + } + public static Double min(List data){ + if(CollUtils.isEmpty(data)){ + return null; + } + return data.stream() + .min(Comparator.comparingDouble(num -> num)) + .orElse(0d); + } + + public static Double average(List data){ + if(CollUtils.isEmpty(data)){ + return 0d; + } + return data.stream() + .collect(Collectors.averagingDouble(Double::doubleValue)); + + } + + public static Integer toInt(Object obj) { + return obj == null ? null + : obj instanceof Integer + ? (int) obj : null; + } + + /** + * 取绝对值,如果为null,返回0 + * @param number 数值 + * @return 绝对值 + */ + public static int abs(Integer number) { + return number == null + ? 0 + : Math.abs(number); + } + + /** + * 数字格式化字符串,不足位数补0 + * + * @param originNumber 原始数字 + * @param digit 数字位数 + * @return 字符串 + */ + public static String repair0(Integer originNumber, Integer digit){ + StringBuilder number = new StringBuilder(originNumber + ""); + while (number.length() < digit) { + number.insert(0, "0"); + } + return number.toString(); + } + + public static Integer null2Default(Integer originNumber, int defaultNumber) { + return originNumber == null ? defaultNumber : originNumber; + } + + public static Long null2Default(Long originNumber, long defaultNumber) { + return originNumber == null ? defaultNumber : originNumber; + } +} diff --git a/framework/common/src/main/java/com/itmingchen/common/utils/ObjectUtils.java b/framework/common/src/main/java/com/itmingchen/common/utils/ObjectUtils.java new file mode 100644 index 0000000..c669782 --- /dev/null +++ b/framework/common/src/main/java/com/itmingchen/common/utils/ObjectUtils.java @@ -0,0 +1,61 @@ +package com.itmingchen.common.utils; + +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; + +import java.lang.reflect.Field; +import java.math.BigDecimal; +import java.util.function.Function; +import java.util.function.Supplier; + +/** + * Object操作工具 + **/ +public class ObjectUtils extends ObjectUtil { + + /** + * 获取对象t的某个字段值 + * + * @param t 获取对象t + * @param function labda表达式,例如Orders::get + * @return 对象t的某个字段值 + * @param 对象t的类型 + * @param 对象t对应字段的类型 + */ + public static R get(T t, Function function) { + if(t == null) { + return null; + } + return function.apply(t); + } + + /** + * 转换成指定类型数据 + * @param t 转换前对象t + * @param clazz 转换目标对象class + * @return 转换后的对象或数据 + * @param 转换前对象类型 + * @param 转换后对象类型 + */ + public static R parse(T t, Class clazz) { + if(t == null) { + return null; + } + if(!ClassUtils.equals(clazz, ClassUtils.getClassName(t, false), false)){ + throw new RuntimeException("数据转换异常,数据转换类型错误"); + } + return (R)t; + } + + /** + * 如果有值直接返回,无值返回默认值 + * + * @param originObject 原始值 + * @param defaultObject 默认值 + * @return T类型的对象 + * @param 返回值和入参的类型 + */ + public static T defaultIfEmpty(final T originObject, final T defaultObject) { + return isNull(originObject) ? defaultObject : originObject; + } +} diff --git a/framework/common/src/main/java/com/itmingchen/common/utils/PictureUtil.java b/framework/common/src/main/java/com/itmingchen/common/utils/PictureUtil.java new file mode 100644 index 0000000..abc7cf7 --- /dev/null +++ b/framework/common/src/main/java/com/itmingchen/common/utils/PictureUtil.java @@ -0,0 +1,11 @@ +package com.itmingchen.common.utils; + +public class PictureUtil { + + public static String randomBlogFirstPicture() { + int m = 0; + int n = 9; + int temp=m+(int)(Math.random()*(n+1-m)); + return "https://cdn.jsdelivr.net/gh/mingchen/JsDelivr/ContentThumb/"+temp+".jpg"; + } +} diff --git a/framework/common/src/main/java/com/itmingchen/common/utils/QQInfoUtils.java b/framework/common/src/main/java/com/itmingchen/common/utils/QQInfoUtils.java new file mode 100644 index 0000000..f3c8a72 --- /dev/null +++ b/framework/common/src/main/java/com/itmingchen/common/utils/QQInfoUtils.java @@ -0,0 +1,33 @@ +package com.itmingchen.common.utils; + +import org.springframework.web.client.RestTemplate; + +import java.io.UnsupportedEncodingException; + +/** + * @Description: 获取QQ昵称头像信息 + * @Date: 2024-09-10 + */ +public class QQInfoUtils { + private static RestTemplate restTemplate = new RestTemplate(); + private static final String QQ_NICKNAME_URL = "http://users.qzone.qq.com/fcg-bin/cgi_get_portrait.fcg?uins={1}"; + private static final String QQ_AVATAR_URL = "https://q1.qlogo.cn/g?b=qq&nk=%s&s=100"; + + public static String getQQNickname(String qq) throws UnsupportedEncodingException { + String res = restTemplate.getForObject(QQ_NICKNAME_URL, String.class, qq); + byte[] bytes = res.getBytes("iso-8859-1"); + String nickname = new String(bytes, "gb18030").split(",")[6].replace("\"", ""); + if ("".equals(nickname)) { + return "nickname"; + } + return nickname; + } + + public static String getQQAvatarURL(String qq) { + return String.format(QQ_AVATAR_URL, qq); + } + + public static boolean isQQNumber(String nickname) { + return nickname.matches("^[1-9][0-9]{4,10}$"); + } +} \ No newline at end of file diff --git a/framework/common/src/main/java/com/itmingchen/common/utils/RedisUtil.java b/framework/common/src/main/java/com/itmingchen/common/utils/RedisUtil.java new file mode 100644 index 0000000..9137ac8 --- /dev/null +++ b/framework/common/src/main/java/com/itmingchen/common/utils/RedisUtil.java @@ -0,0 +1,609 @@ +package com.itmingchen.common.utils; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.itmingchen.common.expcetions.ErrorRequestException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.TimeUnit; + +/** + * @ClassName RedisUtil + * @Description: Redis 工具类,提供常用的 Redis 操作方法 + * @Author: 3177583214@qq.com + */ +@Component +public final class RedisUtil { + + @Autowired + private RedisTemplate redisTemplate; + + @Autowired + private ObjectMapper objectMapper; // Spring Boot 默认自动配置 + + /** + * 获取匹配的 key 集合 + * @param pattern 匹配模式 + * @return 匹配的 key 集合 + */ + public Set keys(String pattern){ + try { + return redisTemplate.keys(pattern); + } catch (Exception e){ + e.printStackTrace(); + return null; + } + } + + /** + * 指定缓存失效时间 + * @param key 键 + * @param time 时间(秒) + * @return 是否设置成功 + */ + public boolean expire(String key, long time) { + try { + if (time > 0) { + return redisTemplate.expire(key, time, TimeUnit.SECONDS); + } + return false; + } catch (Exception e){ + e.printStackTrace(); + return false; + } + } + + /** + * 获取 key 的过期时间 + * @param key 键 + * @return 时间(秒),返回 -1 表示永久有效,返回 -2 表示 key 不存在 + */ + public long getExpire(String key) { + try { + Long expire = redisTemplate.getExpire(key, TimeUnit.SECONDS); + return expire != null ? expire : -1; + } catch (Exception e){ + e.printStackTrace(); + return -1; + } + } + + /** + * 判断 key 是否存在 + * @param key 键 + * @return 是否存在 + */ + public boolean hasKey(String key){ + try { + return Boolean.TRUE.equals(redisTemplate.hasKey(key)); + } catch (Exception e){ + e.printStackTrace(); + return false; + } + } + + /** + * 删除一个或多个 key + * @param keys 键数组 + */ + @SuppressWarnings("unchecked") + public void del(String... keys){ + if (keys != null && keys.length > 0){ + if (keys.length == 1){ + redisTemplate.delete(keys[0]); + } else{ + redisTemplate.delete((Collection) CollectionUtils.arrayToList(keys)); + } + } + } + + /** + * 普通缓存获取 + * @param key 键 + * @return 值 + */ + public Object get(String key){ + return key == null ? null : redisTemplate.opsForValue().get(key); + } + + /** + * 普通缓存放入 + * @param key 键 + * @param value 值 + * @return 是否成功 + */ + public boolean set(String key, Object value){ + try { + redisTemplate.opsForValue().set(key, value); + return true; + } catch (Exception e){ + e.printStackTrace(); + return false; + } + } + + /** + * 普通缓存放入并设置时间 + * @param key 键 + * @param value 值 + * @param time 时间(秒) time > 0 设置过期时间,否则不设置 + * @return 是否成功 + */ + public boolean set(String key, Object value, long time){ + try { + if (time > 0){ + redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS); + } else{ + set(key, value); + } + return true; + } catch (Exception e){ + e.printStackTrace(); + return false; + } + } + + /** + * 普通缓存放入,NX(不存在才放) + * @param key 键 + * @param value 值 + * @return 是否成功 + */ + public boolean setIfAbsent(String key, Object value){ + try { + return Boolean.TRUE.equals(redisTemplate.opsForValue().setIfAbsent(key, value)); + } catch (Exception e){ + e.printStackTrace(); + return false; + } + } + + /** + * 普通缓存放入,NX 并设置过期时间 + * @param key 键 + * @param value 值 + * @param time 时间(秒) + * @return 是否成功 + */ + public boolean setIfAbsent(String key, Object value, long time){ + try { + if (time > 0){ + return Boolean.TRUE.equals(redisTemplate.opsForValue().setIfAbsent(key, value, time, TimeUnit.SECONDS)); + } else { + return setIfAbsent(key, value); + } + } catch (Exception e){ + e.printStackTrace(); + return false; + } + } + + /** + * 递增 + * @param key 键 + * @param delta 增量(必须大于0) + * @return 新值 + */ + public long incr(String key, long delta){ + if (delta < 0){ + throw new RuntimeException("递增因子必须大于0"); + } + return redisTemplate.opsForValue().increment(key, delta); + } + + /** + * 递减 + * @param key 键 + * @param delta 减量(必须大于0) + * @return 新值 + */ + public long decr(String key, long delta){ + if (delta < 0){ + throw new RuntimeException("递减因子必须大于0"); + } + return redisTemplate.opsForValue().increment(key, -delta); + } + + /** + * 根据 key 获取对象,并转换为指定类型 + * @param key 键 + * @param type 目标类型 + * @param 泛型类型 + * @return 转换后的对象 + */ + public T getObjectByValue(String key, Class type){ + Object value = redisTemplate.opsForValue().get(key); + if (value == null){ + return null; + } + try { + return objectMapper.convertValue(value, type); + } catch (IllegalArgumentException e){ + String errorMsg = String.format("Redis键[%s]转换到类型[%s]失败", key, type.getSimpleName()); + throw new ErrorRequestException(errorMsg, e); + } + } + + /** + * Hash 获取指定字段的值 + * @param key 键 + * @param field 字段 + * @return 值 + */ + public Object getHashItem(String key, String field){ + return redisTemplate.opsForHash().get(key, field); + + } + + /** + * 获取所有 Hash 字段和值 + * @param key 键 + * @return 字段和值的 Map + */ + public Map getAllHashValue(String key){ + return redisTemplate.opsForHash().entries(key); + } + + /** + * Hash 批量设置字段和值 + * @param key 键 + * @param map 字段和值的 Map + * @return 是否成功 + */ + public boolean setHash(String key, Map map){ + try { + redisTemplate.opsForHash().putAll(key, map); + return true; + } catch (Exception e){ + e.printStackTrace(); + return false; + } + } + + /** + * Hash 设置单个字段和值 + * @param key 键 + * @param field 字段 + * @param value 值 + * @return 是否成功 + */ + public boolean setHash(String key, String field, Object value){ + try { + redisTemplate.opsForHash().put(key, field, value); + return true; + } catch (Exception e){ + e.printStackTrace(); + return false; + } + } + + /** + * Hash 设置单个字段和值,并设置过期时间 + * @param key 键 + + * @param time 过期时间(秒) + * @return 是否成功 + */ + public boolean setHashPro(String key, Map map, long time){ + try { + redisTemplate.opsForHash().putAll(key, map); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * Hash 删除一个或多个字段 + * @param key 键 + * @param fields 字段数组 + */ + public void delHashByKey(String key, Object... fields){ + redisTemplate.opsForHash().delete(key, fields); + } + + /** + * Hash 判断是否存在某字段 + * @param key 键 + * @param field 字段 + * @return 是否存在 + */ + public boolean isHasKey(String key, String field){ + return Boolean.TRUE.equals(redisTemplate.opsForHash().hasKey(key, field)); + } + + /** + * Hash 递增 + * @param key 键 + * @param field 字段 + * @param delta 增量 + * @return 新值 + */ + public double incrHash(String key, String field, double delta){ + return redisTemplate.opsForHash().increment(key, field, delta); + } + + /** + * Hash 递减 + * @param key 键 + * @param field 字段 + * @param delta 减量 + * @return 新值 + */ + public double decrHash(String key, String field, double delta){ + return redisTemplate.opsForHash().increment(key, field, -delta); + } + + /** + * 获取 Set 中的所有成员 + * @param key 键 + * @return Set 的所有成员 + */ + public Set getSetAllValueByKey(String key){ + try { + return redisTemplate.opsForSet().members(key); + } catch (Exception e){ + e.printStackTrace(); + return null; + } + } + + /** + * 判断 Set 中是否存在某成员 + * @param key 键 + * @param value 值 + * @return 是否存在 + */ + public boolean hasValueInSet(String key, Object value){ + try { + return Boolean.TRUE.equals(redisTemplate.opsForSet().isMember(key, value)); + } catch (Exception e){ + e.printStackTrace(); + return false; + } + } + + /** + * 向 Set 添加一个或多个成员 + * @param key 键 + * @param values 成员数组 + * @return 添加的个数 + */ + public long setSet(String key, Object... values){ + try { + return redisTemplate.opsForSet().add(key, values); + } catch (Exception e){ + e.printStackTrace(); + return 0; + } + } + + /** + * 向 Set 添加一个或多个成员,并设置过期时间 + * @param key 键 + * @param time 过期时间(秒) + * @param values 成员数组 + * @return 添加的个数 + */ + public long setSetPro(String key, long time, Object... values){ + try { + Long count = redisTemplate.opsForSet().add(key, values); + if (count != null && time > 0){ + expire(key, time); + } + return count != null ? count : 0; + } catch (Exception e){ + e.printStackTrace(); + return 0; + } + } + + /** + * 获取 Set 的大小 + * @param key 键 + * @return Set 的大小 + */ + public long countBySet(String key){ + try { + Long size = redisTemplate.opsForSet().size(key); + return size != null ? size : 0; + } catch (Exception e){ + e.printStackTrace(); + return 0; + } + } + + /** + * 从 Set 中移除一个或多个成员 + * @param key 键 + * @param values 成员数组 + * @return 移除的个数 + */ + public long deleteValueBySet(String key, Object... values){ + try { + Long removed = redisTemplate.opsForSet().remove(key, values); + return removed != null ? removed : 0; + } catch (Exception e){ + e.printStackTrace(); + return 0; + } + } + + /** + * 获取 List 中指定范围的元素 + * @param key 键 + * @param start 起始索引 + * @param end 结束索引(-1 表示最后一个元素) + * @return List 的指定范围的元素 + */ + public List getListByValue(String key, long start, long end){ + try { + return redisTemplate.opsForList().range(key, start, end); + } catch (Exception e){ + e.printStackTrace(); + return null; + } + } + + /** + * 获取 List 的长度 + * @param key 键 + * @return List 的长度 + */ + public long getListSize(String key){ + try { + Long size = redisTemplate.opsForList().size(key); + return size != null ? size : 0; + } catch (Exception e){ + e.printStackTrace(); + return 0; + } + } + + /** + * 通过索引获取 List 中的值 + * @param key 键 + * @param index 索引(>=0 从头部开始,<0 从尾部开始) + * @return List 中的值 + */ + public Object getListValueByKeyAndIndex(String key, long index){ + try { + return redisTemplate.opsForList().index(key, index); + } catch (Exception e){ + e.printStackTrace(); + return null; + } + } + + /** + * 向 List 右侧推入一个元素 + * @param key 键 + * @param value 值 + * @return 是否成功 + */ + public boolean saveListToValue(String key, Object value){ + try { + redisTemplate.opsForList().rightPush(key, value); + return true; + } catch (Exception e){ + e.printStackTrace(); + return false; + } + } + + /** + * 向 List 右侧推入一个元素,并设置过期时间 + * @param key 键 + * @param value 值 + * @param time 过期时间(秒) + * @return 是否成功 + */ + public boolean saveListToValue(String key, Object value, long time){ + try { + redisTemplate.opsForList().rightPush(key, value); + if (time > 0){ + expire(key, time); + } + return true; + } catch (Exception e){ + e.printStackTrace(); + return false; + } + } + + /** + * 向 List 右侧推入多个元素 + * @param key 键 + * @param values 值的集合 + * @return 是否成功 + */ + public boolean saveListToValue(String key, List values){ + try { + redisTemplate.opsForList().rightPushAll(key, values); + return true; + } catch (Exception e){ + e.printStackTrace(); + return false; + } + } + + /** + * 向 List 右侧推入多个元素,并设置过期时间 + * @param key 键 + * @param values 值的集合 + * @param time 过期时间(秒) + * @return 是否成功 + */ + public boolean saveListToValue(String key, List values, long time){ + try { + redisTemplate.opsForList().rightPushAll(key, values); + if (time > 0){ + expire(key, time); + } + return true; + } catch (Exception e){ + e.printStackTrace(); + return false; + } + } + + /** + * 通过索引更新 List 中的值 + * @param key 键 + * @param index 索引 + * @param value 新值 + * @return 是否成功 + */ + public boolean updateListValueByIndex(String key, long index, Object value){ + try { + redisTemplate.opsForList().set(key, index, value); + return true; + } catch (Exception e){ + e.printStackTrace(); + return false; + } + } + + /** + * 从 List 中移除指定数量的指定值 + * @param key 键 + * @param count 移除数量 + * @param value 值 + * @return 移除的个数 + */ + public long delValueByCount(String key, long count, Object value){ + try { + Long removed = redisTemplate.opsForList().remove(key, count, value); + return removed != null ? removed : 0; + } catch (Exception e){ + e.printStackTrace(); + return 0; + } + } + + /** + * 将对象保存到 Redis,并转换为指定类型 + * @param key 键 + * @param object 对象 + * @return 是否成功 + */ + public boolean saveObjectToValue(String key, Object object){ + try { + redisTemplate.opsForValue().set(key, object); + return true; + } catch (Exception e){ + e.printStackTrace(); + return false; + } + } +} diff --git a/framework/common/src/main/java/com/itmingchen/common/utils/RedisUtils.java b/framework/common/src/main/java/com/itmingchen/common/utils/RedisUtils.java new file mode 100644 index 0000000..61012c6 --- /dev/null +++ b/framework/common/src/main/java/com/itmingchen/common/utils/RedisUtils.java @@ -0,0 +1,128 @@ +package com.itmingchen.common.utils; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; + +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** + * @ClassName RedisUtils + * @Description: TODO + * @Author: 3177583214@qq.com + */ +public class RedisUtils { + @Autowired + RedisTemplate jsonRedisTemplate; + + + + + + public void saveKVToHash(String hash, Object key, Object value) { + jsonRedisTemplate.opsForHash().put(hash, key, value); + } + + + public void saveMapToHash(String hash, Map map) { + jsonRedisTemplate.opsForHash().putAll(hash, map); + } + + + public Map getMapByHash(String hash) { + return jsonRedisTemplate.opsForHash().entries(hash); + } + + + public Object getValueByHashKey(String hash, Object key) { + return jsonRedisTemplate.opsForHash().get(hash, key); + } + + + public void incrementByHashKey(String hash, Object key, int increment) { + if (increment < 0) { + throw new RuntimeException("递增因子必须大于0"); + } + jsonRedisTemplate.opsForHash().increment(hash, key, increment); + } + + + public void deleteByHashKey(String hash, Object key) { + jsonRedisTemplate.opsForHash().delete(hash, key); + } + + + public List getListByValue(String key) { + List redisResult = (List) jsonRedisTemplate.opsForValue().get(key); + return redisResult; + } + + + public void saveListToValue(String key, List list) { + jsonRedisTemplate.opsForValue().set(key, list); + } + + + public Map getMapByValue(String key) { + Map redisResult = (Map) jsonRedisTemplate.opsForValue().get(key); + return redisResult; + } + + + public void saveMapToValue(String key, Map map) { + jsonRedisTemplate.opsForValue().set(key, map); + } + + + public T getObjectByValue(String key, Class t) { + Object redisResult = jsonRedisTemplate.opsForValue().get(key); + T object = (T) JacksonUtils.convertValue(redisResult, t); + return object; + } + + + public void incrementByKey(String key, int increment) { + if (increment < 0) { + throw new RuntimeException("递增因子必须大于0"); + } + jsonRedisTemplate.opsForValue().increment(key, increment); + } + + + public void saveObjectToValue(String key, Object object) { + jsonRedisTemplate.opsForValue().set(key, object); + } + + + public void saveValueToSet(String key, Object value) { + jsonRedisTemplate.opsForSet().add(key, value); + } + + public int countBySet(String key) { + return jsonRedisTemplate.opsForSet().size(key).intValue(); + } + + + public void deleteValueBySet(String key, Object value) { + jsonRedisTemplate.opsForSet().remove(key, value); + } + + public boolean hasValueInSet(String key, Object value) { + return jsonRedisTemplate.opsForSet().isMember(key, value); + } + + + public void deleteCacheByKey(String key) { + jsonRedisTemplate.delete(key); + } + + + public boolean hasKey(String key) { + return jsonRedisTemplate.hasKey(key); + } + + public void expire(String key, long time) { + jsonRedisTemplate.expire(key, time, TimeUnit.SECONDS); + } +} diff --git a/framework/common/src/main/java/com/itmingchen/common/utils/ReflectUtils.java b/framework/common/src/main/java/com/itmingchen/common/utils/ReflectUtils.java new file mode 100644 index 0000000..7fb9e4a --- /dev/null +++ b/framework/common/src/main/java/com/itmingchen/common/utils/ReflectUtils.java @@ -0,0 +1,20 @@ +package com.itmingchen.common.utils; + +import cn.hutool.core.util.ReflectUtil; + +/** + * 反射工具 + **/ +public class ReflectUtils extends ReflectUtil { + + /** + * 判断一个类中是否含有指定字段 + * + * @param fieldName 指定字段名称 + * @param clazz 类class + * @return 是否包含 true/false + */ + public static boolean containField(String fieldName, Class clazz) { + return getField(clazz, fieldName) != null; + } +} diff --git a/framework/common/src/main/java/com/itmingchen/common/utils/SpelUtils.java b/framework/common/src/main/java/com/itmingchen/common/utils/SpelUtils.java new file mode 100644 index 0000000..77a9a71 --- /dev/null +++ b/framework/common/src/main/java/com/itmingchen/common/utils/SpelUtils.java @@ -0,0 +1,58 @@ +package com.itmingchen.common.utils; + +import org.springframework.expression.ExpressionParser; +import org.springframework.expression.spel.standard.SpelExpressionParser; +import org.springframework.expression.spel.support.StandardEvaluationContext; + +import java.util.ArrayList; +import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class SpelUtils { + + private static final Pattern PATTERN = Pattern.compile("(\\#\\{([^\\}]*)\\})"); + /** + * 将模板中的表达式替换成args参数中的值 + * + * @param formatter 模板 + * @param paraNameArr 方法对应的参数名称 + * @param args 方法参数值value,用来进行退换对应的表达式 + * @return 模板替换后的字符串 + * + * 例 format : counter:#{user.id} + * paraNameAddr [user] + * args [{"user":{"id":1}}] + * + * 转换后结果 -> counter:1 + */ + public static String parse(String formatter, String[] paraNameArr, Object[] args) { + if (StringUtils.isNotBlank(formatter) && formatter.indexOf("#") > -1) { + + Matcher matcher = PATTERN.matcher(formatter); + //将正则表达式中#{}的值取出放在keys中 + List keys = new ArrayList<>(); + while (matcher.find()) { + keys.add(matcher.group()); + } + if (!CollUtils.isEmpty(keys)) { + //SPEL表达式对象 + ExpressionParser parser = new SpelExpressionParser(); + StandardEvaluationContext context = new StandardEvaluationContext(); + //将名称和value一一对应 + for (int i = 0; i < paraNameArr.length; i++) { + context.setVariable(paraNameArr[i], args[i]); + } + + for (String tmp : keys) { + formatter = formatter.replace(tmp, + //通过SPEL表达式获取对应的值,然后再替换掉原有值 + parser.parseExpression("#" + tmp.substring(2, tmp.length() - 1)).getValue(context, String.class)); + } + return formatter; + } + } + return null; + } + +} diff --git a/framework/common/src/main/java/com/itmingchen/common/utils/StrUtils.java b/framework/common/src/main/java/com/itmingchen/common/utils/StrUtils.java new file mode 100644 index 0000000..b0bde23 --- /dev/null +++ b/framework/common/src/main/java/com/itmingchen/common/utils/StrUtils.java @@ -0,0 +1,78 @@ +package com.itmingchen.common.utils; + +import java.io.PrintWriter; +import java.io.StringWriter; + +/** + * @Description: 字符串校验 + * @Date: 2024-08-02 + */ +public class StrUtils { + /** + * 判断字符串是否为空 + * + * @param str 待校验字符串 + * @return + */ + public static boolean isEmpty(String... str) { + for (String s : str) { + if (s == null || "".equals(s.trim())) { + return true; + } + } + return false; + } + + /** + * 判断字符串中是否包含特殊字符 + * + * @param str 待校验字符串 + * @return + */ + public static boolean hasSpecialChar(String... str) { + for (String s : str) { + if (s.contains("%") || s.contains("_") || s.contains("[") || s.contains("#") || s.contains("*")) { + return true; + } + } + return false; + } + + /** + * 截取字符串 + * + * @param str 原始字符串 + * @param start 起始位置 + * @param end 结束位置 + * @return + */ + public static String substring(String str, int start, int end) { + if (str == null || "".equals(str)) { + return ""; + } + if (start < 0 || end < 0) { + return str; + } + if (end > str.length()) { + end = str.length(); + } + if (start >= end) { + return ""; + } + return str.substring(start, end); + } + + /** + * 获取堆栈信息 + * + * @param throwable 异常 + * @return + */ + public static String getStackTrace(Throwable throwable) { + StringWriter sw = new StringWriter(); + try (PrintWriter pw = new PrintWriter(sw)) { + throwable.printStackTrace(pw); + return sw.toString(); + } + } +} diff --git a/framework/common/src/main/java/com/itmingchen/common/utils/StringUtils.java b/framework/common/src/main/java/com/itmingchen/common/utils/StringUtils.java new file mode 100644 index 0000000..66ad890 --- /dev/null +++ b/framework/common/src/main/java/com/itmingchen/common/utils/StringUtils.java @@ -0,0 +1,28 @@ +package com.itmingchen.common.utils; + +import cn.hutool.core.util.StrUtil; + +/** + * 字符串工具类,继承了{@link StrUtil} + **/ +public class StringUtils extends StrUtil { + private static final byte[] TRUE = new byte[]{'T','R','U','E'}; + /** + * 判断是否是字符串 + * @param bytes + * @return + */ + public static boolean isStr(byte[] bytes) { + if(TRUE.equals(bytes)) { + return false; + } + for (byte word : bytes) { + //判断是数字 + if(word >= 48 && word <= 57) { + continue; + } + return true; + } + return false; + } +} \ No newline at end of file diff --git a/framework/common/src/main/java/com/itmingchen/common/utils/UserAgentUtils.java b/framework/common/src/main/java/com/itmingchen/common/utils/UserAgentUtils.java new file mode 100644 index 0000000..ff49c6f --- /dev/null +++ b/framework/common/src/main/java/com/itmingchen/common/utils/UserAgentUtils.java @@ -0,0 +1,42 @@ +package com.itmingchen.common.utils; + +import nl.basjes.parse.useragent.UserAgent; +import nl.basjes.parse.useragent.UserAgentAnalyzer; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.Map; + +/** + * @Description: UserAgent解析工具类 + * @Date: 2024-11-30 + */ +@Component +public class UserAgentUtils { + private UserAgentAnalyzer uaa; + + public UserAgentUtils() { + this.uaa = UserAgentAnalyzer + .newBuilder() + .hideMatcherLoadStats() + .withField("OperatingSystemNameVersionMajor") + .withField("AgentNameVersion") + .build(); + } + + /** + * 从User-Agent解析客户端操作系统和浏览器版本 + * + * @param userAgent + * @return + */ + public Map parseOsAndBrowser(String userAgent) { + UserAgent agent = uaa.parse(userAgent); + String os = agent.getValue("OperatingSystemNameVersionMajor"); + String browser = agent.getValue("AgentNameVersion"); + Map map = new HashMap<>(); + map.put("os", os); + map.put("browser", browser); + return map; + } +} diff --git a/framework/es/.gitignore b/framework/es/.gitignore new file mode 100644 index 0000000..5ff6309 --- /dev/null +++ b/framework/es/.gitignore @@ -0,0 +1,38 @@ +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### IntelliJ IDEA ### +.idea/modules.xml +.idea/jarRepositories.xml +.idea/compiler.xml +.idea/libraries/ +*.iws +*.iml +*.ipr + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store \ No newline at end of file diff --git a/framework/es/pom.xml b/framework/es/pom.xml new file mode 100644 index 0000000..3cbb97a --- /dev/null +++ b/framework/es/pom.xml @@ -0,0 +1,54 @@ + + + + parent + mingchen + 1.1-SNAPSHOT + ../parent + + 4.0.0 + + es + + + 11 + 11 + + + + + mingchen + common + 1.1-SNAPSHOT + + + org.elasticsearch.client + elasticsearch-rest-high-level-client + + + org.springframework.boot + spring-boot-autoconfigure + + + co.elastic.clients + elasticsearch-java + + + com.fasterxml.jackson.core + jackson-databind + provided + + + jakarta.json + jakarta.json-api + + + org.springframework.boot + spring-boot-starter-test + test + + + + \ No newline at end of file diff --git a/framework/es/src/main/java/com/itmingchen/es/config/EsConfiguration.java b/framework/es/src/main/java/com/itmingchen/es/config/EsConfiguration.java new file mode 100644 index 0000000..899a2fb --- /dev/null +++ b/framework/es/src/main/java/com/itmingchen/es/config/EsConfiguration.java @@ -0,0 +1,60 @@ +package com.itmingchen.es.config; + +import cn.hutool.core.date.DatePattern; +import com.itmingchen.es.core.ElasticSearchTemplate; +import com.itmingchen.es.core.impl.ElasticSearchTemplateImpl; +import com.itmingchen.es.properties.EsProperties; +import co.elastic.clients.elasticsearch.ElasticsearchClient; +import co.elastic.clients.json.jackson.JacksonJsonpMapper; +import co.elastic.clients.transport.ElasticsearchTransport; +import co.elastic.clients.transport.rest_client.RestClientTransport; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.PropertyNamingStrategies; +import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; +import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer; +import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; +import org.apache.http.HttpHost; +import org.elasticsearch.client.RestClient; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; + +@Configuration +@EnableConfigurationProperties(EsProperties.class) +public class EsConfiguration { + + private static final ObjectMapper MAPPER = new ObjectMapper(); + + static { + MAPPER.setPropertyNamingStrategy(PropertyNamingStrategies.SNAKE_CASE); + MAPPER.setSerializationInclusion(JsonInclude.Include.NON_NULL); + + JavaTimeModule javaTimeModule = new JavaTimeModule(); + DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(DatePattern.NORM_DATETIME_PATTERN); + javaTimeModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(dateTimeFormatter)); + javaTimeModule.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(dateTimeFormatter)); + MAPPER.registerModule(javaTimeModule); + + } + + @Bean + public ElasticsearchClient esClient(EsProperties esProperties) { + RestClient restClient = RestClient.builder(new HttpHost(esProperties.getHost(), esProperties.getPort())).build(); + // Create the transport with a Jackson mapper + // 使用自定义json序列化 + JacksonJsonpMapper jacksonJsonpMapper = new JacksonJsonpMapper(MAPPER); + + ElasticsearchTransport transport = new RestClientTransport(restClient, jacksonJsonpMapper); + // And create the API client + return new ElasticsearchClient(transport); + } + + @Bean + public ElasticSearchTemplate template(ElasticsearchClient elasticsearchClient) { + return new ElasticSearchTemplateImpl(elasticsearchClient); + } +} diff --git a/framework/es/src/main/java/com/itmingchen/es/constants/FieldConstants.java b/framework/es/src/main/java/com/itmingchen/es/constants/FieldConstants.java new file mode 100644 index 0000000..a07e33b --- /dev/null +++ b/framework/es/src/main/java/com/itmingchen/es/constants/FieldConstants.java @@ -0,0 +1,5 @@ +package com.itmingchen.es.constants; + +public class FieldConstants { + public static final String ID = "id"; +} diff --git a/framework/es/src/main/java/com/itmingchen/es/core/ElasticSearchTemplate.java b/framework/es/src/main/java/com/itmingchen/es/core/ElasticSearchTemplate.java new file mode 100644 index 0000000..cee1f81 --- /dev/null +++ b/framework/es/src/main/java/com/itmingchen/es/core/ElasticSearchTemplate.java @@ -0,0 +1,9 @@ +package com.itmingchen.es.core; + +import com.itmingchen.es.core.operations.DocumentOperations; +import com.itmingchen.es.core.operations.IndexOperations; + +public interface ElasticSearchTemplate { + DocumentOperations opsForDoc(); + IndexOperations opsForIndex(); +} diff --git a/framework/es/src/main/java/com/itmingchen/es/core/impl/ElasticSearchTemplateImpl.java b/framework/es/src/main/java/com/itmingchen/es/core/impl/ElasticSearchTemplateImpl.java new file mode 100644 index 0000000..cbe63d6 --- /dev/null +++ b/framework/es/src/main/java/com/itmingchen/es/core/impl/ElasticSearchTemplateImpl.java @@ -0,0 +1,28 @@ +package com.itmingchen.es.core.impl; + +import com.itmingchen.es.core.ElasticSearchTemplate; +import com.itmingchen.es.core.operations.DefaultDocumentOperations; +import com.itmingchen.es.core.operations.DefaultIndexOperations; +import com.itmingchen.es.core.operations.DocumentOperations; +import com.itmingchen.es.core.operations.IndexOperations; +import co.elastic.clients.elasticsearch.ElasticsearchClient; +import org.springframework.stereotype.Component; + +@Component +public class ElasticSearchTemplateImpl implements ElasticSearchTemplate { + private final ElasticsearchClient elasticsearchClient; + + public ElasticSearchTemplateImpl(ElasticsearchClient elasticsearchClient) { + this.elasticsearchClient = elasticsearchClient; + } + + @Override + public DocumentOperations opsForDoc() { + return new DefaultDocumentOperations(elasticsearchClient); + } + + @Override + public IndexOperations opsForIndex() { + return new DefaultIndexOperations(elasticsearchClient); + } +} diff --git a/framework/es/src/main/java/com/itmingchen/es/core/operations/DefaultDocumentOperations.java b/framework/es/src/main/java/com/itmingchen/es/core/operations/DefaultDocumentOperations.java new file mode 100644 index 0000000..19e59c7 --- /dev/null +++ b/framework/es/src/main/java/com/itmingchen/es/core/operations/DefaultDocumentOperations.java @@ -0,0 +1,333 @@ +package com.itmingchen.es.core.operations; + + +import co.elastic.clients.elasticsearch._types.Result; +import com.itmingchen.common.expcetions.CommonException; +import com.itmingchen.common.expcetions.ElasticSearchException; +import com.itmingchen.common.model.PageResult; +import com.itmingchen.common.model.dto.PageQueryDTO; +import com.itmingchen.common.utils.*; +import com.itmingchen.es.constants.FieldConstants; +import com.itmingchen.es.utils.TermUtils; +import co.elastic.clients.elasticsearch.ElasticsearchClient; +import co.elastic.clients.elasticsearch._types.GeoDistanceType; +import co.elastic.clients.elasticsearch._types.SortOrder; +import co.elastic.clients.elasticsearch._types.WriteResponseBase; +import co.elastic.clients.elasticsearch._types.query_dsl.FieldAndFormat; +import co.elastic.clients.elasticsearch._types.query_dsl.TermsQuery; +import co.elastic.clients.elasticsearch._types.query_dsl.TermsQueryField; +import co.elastic.clients.elasticsearch.core.*; +import co.elastic.clients.elasticsearch.core.search.Hit; +import lombok.extern.slf4j.Slf4j; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 后期优化分页功能 todo,临时使用 + */ +@Slf4j +public class DefaultDocumentOperations implements DocumentOperations { + private final ElasticsearchClient elasticsearchClient; + + public DefaultDocumentOperations(ElasticsearchClient elasticsearchClient) { + this.elasticsearchClient = elasticsearchClient; + } + + @Override + public Boolean insert(String index, T document) { + + try { + CreateResponse createResponse = elasticsearchClient.create(builder -> builder.id(getId(document)).document(document).index(index)); + log.debug("create document response : {}", createResponse); + boolean success = isSuccess(createResponse); + return success; + + } catch (IOException e) { +// e.printStackTrace(); + log.error(e.getMessage(),e); + throw new CommonException(500,e.getMessage()); + } +// return false; + } + + @Override + public Boolean batchInsert(String index, List documents) { + BulkRequest.Builder br = new BulkRequest.Builder(); + for (T document : documents) { + br.operations(op -> op.index(idx -> idx.index(index) + .id(getId(document)) + .document(document))); + } + try { + BulkResponse bulk = elasticsearchClient.bulk(br.build()); + Boolean success = isSuccess(bulk); + return success; + } catch (IOException e) { + log.error(e.getMessage(),e); + throw new CommonException(500,e.getMessage()); + } + } + + @Override + public Boolean batchUpsert(String index, List documents) { + if (CollUtils.isEmpty(documents)) { + return false; + } + List ids = documents.stream().map(document -> getId(document)).collect(Collectors.toList()); + List documentInEs = this.findByIds(index, ids, Arrays.asList(FieldConstants.ID), documents.get(0).getClass()); + List idsInEs = CollUtils.isEmpty(documentInEs) ? new ArrayList<>() : documentInEs.stream().map(document -> getId(document)).collect(Collectors.toList()); + + BulkRequest.Builder builder = new BulkRequest.Builder(); + for (T document : documents) { + String id = getId(document); + boolean exists = idsInEs.contains(id); + + builder.operations(op -> { + if (exists) { + op.update(u -> u.action(a -> a.doc(document)).index(index).id(id)); + } else { + op.index(idx -> idx.index(index) + .id(id) + .document(document)); + } + return op; + }); + } + try { + BulkResponse bulk = elasticsearchClient.bulk(builder.build()); + Boolean success = isSuccess(bulk); + return success; + } catch (IOException e) { + log.error(e.getMessage(),e); + throw new CommonException(500,e.getMessage()); + } + } + + @Override + public Boolean updateById(String index, T document) { + Object id = ReflectUtils.getFieldValue(document, IdUtils.ID); + if (id == null) { + throw new ElasticSearchException("es更新失败,id为空"); + } + try { + // 2.数据更新 + UpdateResponse response = elasticsearchClient.update(u -> u + .index(index) + .id(id.toString()) + .doc(document) + , document.getClass()); + Boolean success = isSuccess(response); + return success; + + } catch (IOException e) { + log.error(e.getMessage(),e); + throw new CommonException(500,e.getMessage()); + } + } + + @Override + public Boolean deleteById(String index, ID id) { + + try { + // 2.数据更新 + DeleteResponse response = elasticsearchClient.delete(builder -> builder.id(id.toString()).index(index)); + Boolean success = isSuccess(response); + return success; + } catch (IOException e) { + log.error(e.getMessage(),e); + throw new CommonException(500,e.getMessage()); + } + + } + + @Override + public Boolean batchDelete(String index, List ids) { + BulkRequest.Builder builder = new BulkRequest.Builder(); + + + ids.stream().forEach(id -> + builder.operations(b -> b.delete(d -> d.index(index).id(id.toString()))) + ); + + + try { + BulkResponse bulk = elasticsearchClient.bulk(builder.build()); + Boolean success = isSuccess(bulk); + return success; + } catch (Exception e) { + log.error(e.getMessage(),e); + throw new CommonException(500,e.getMessage()); + } + + } + + @Override + public T findById(String index, ID id, Class clazz) { + try { + GetResponse response = elasticsearchClient.get(GetRequest.of(builder -> builder.id(id.toString()).index(index)), clazz); + return response.source(); + } catch (IOException e) { + log.error(e.getMessage(),e); + throw new CommonException(500,e.getMessage()); + } + } + + @Override + public List findByIds(String index, List ids, Class clazz) { + SearchRequest.Builder searchRequestBuild = new SearchRequest.Builder(); + TermsQuery termsQuery = TermsQuery.of(t -> t.field(FieldConstants.ID).terms(new TermsQueryField.Builder().value(TermUtils.parse(ids)).build())); + + searchRequestBuild.index(index) + .query(builder -> builder.terms(termsQuery)); + try { + + SearchResponse searchResponse = elasticsearchClient.search(searchRequestBuild.build(), clazz); + return searchResponse.hits().hits() + .stream() + .map(tHit -> tHit.source()) + .collect(Collectors.toList()); + } catch (IOException e) { + log.error(e.getMessage(),e); + throw new CommonException(500,e.getMessage()); + } + } + + @Override + public List findByIds(String index, List ids, List fields, Class clazz) { + SearchRequest.Builder searchRequestBuild = new SearchRequest.Builder(); + TermsQuery termsQuery = TermsQuery.of(t -> t.field(FieldConstants.ID).terms(new TermsQueryField.Builder().value(TermUtils.parse(ids)).build())); + searchRequestBuild.index(index) + .query(builder -> builder.terms(termsQuery)); + if (CollUtils.isNotEmpty(fields)) { + List fieldAndFormats = fields.stream().map(field -> FieldAndFormat.of(builder -> builder.field(field))).collect(Collectors.toList()); + searchRequestBuild.fields(fieldAndFormats); + } + try { + + SearchResponse searchResponse = elasticsearchClient.search(searchRequestBuild.build(), clazz); + return searchResponse.hits().hits() + .stream() + .map(tHit -> tHit.source()) + .collect(Collectors.toList()); + } catch (IOException e) { + log.error(e.getMessage(),e); + throw new CommonException(500,e.getMessage()); + } + + } + + @Override + public PageResult findForPage(PageQueryDTO pageQueryDTO, Class targetClass) { + + SearchRequest.Builder builder = new SearchRequest.Builder(); + builder.from(pageQueryDTO.calFrom().intValue()); + builder.size(pageQueryDTO.getPageSize().intValue()); + + SearchRequest searchRequest = new SearchRequest.Builder().build(); + try { + + SearchResponse search = elasticsearchClient.search(searchRequest, targetClass); + long total = search.hits().total().value(); + List data = search.hits().hits().stream().map(Hit::source).collect(Collectors.toList()); + return PageResult.of(data,Integer.parseInt(pageQueryDTO.getPageSize()+""),pageQueryDTO.getPageNo(),total); + } catch (IOException e) { + log.error(e.getMessage(),e); + throw new CommonException(500,e.getMessage()); + } + } + + @Override + public List searchByWithGeo(String index, SearchRequest.Builder searchBuilder, String locationName, String location, double distance, String sortBy, Boolean isAsc, int size, Class clazz) { + // 坐标,距离 + searchBuilder.query(query -> + query.bool(q -> + q.filter(filter-> + filter.geoDistance(geo->{ + geo.distance(distance + "km"); + geo.field(locationName); + geo.location(location1 -> location1.text(location)); + geo.distanceType(GeoDistanceType.Arc); + return geo;})) + ) + ); + // 自定排序字段和排序 + if(StringUtils.isNotEmpty(sortBy)){ + searchBuilder.sort(sortOptionsBuilder -> + sortOptionsBuilder.field(fieldSortBuilder->{ + fieldSortBuilder.field(sortBy); + fieldSortBuilder.order(BooleanUtils.isTrue(isAsc) ? SortOrder.Asc : SortOrder.Desc); + return fieldSortBuilder; + }) + ); + } + searchBuilder.size(size); + searchBuilder.index(index); + try { + SearchResponse searchResponse = elasticsearchClient.search(searchBuilder.build(), clazz); + + return searchResponse.hits().hits() + .stream() + .map(tHit -> tHit.source()) + .collect(Collectors.toList()); + }catch (IOException e){ + log.error(e.getMessage(),e); + throw new CommonException(500,e.getMessage()); + } + } + + @Override + public SearchResponse search(SearchRequest searchRequest, Class clazz) { + try { + return elasticsearchClient.search(searchRequest,clazz); + }catch (IOException e){ + log.error(e.getMessage(),e); + throw new CommonException(500,e.getMessage()); + } + } + + private boolean isSuccess(WriteResponseBase writeResponseBase) { + //todo + return writeResponseBase != null && + (Result.Created.equals(writeResponseBase.result()) || + Result.Deleted.equals(writeResponseBase.result()) || + Result.Updated.equals(writeResponseBase.result()) || + Result.NoOp.equals(writeResponseBase.result())); + } + + private Boolean isSuccess(BulkResponse response) { + //todo + log.debug("bulk response : {}", JsonUtils.toJsonStr(response)); + if(response.errors()) { + return false; + } + return response.items().stream() + .filter(item -> item.status() != 200) + .map(item -> false) + .findFirst().orElse(true); + } + + public Boolean isSuccess(DeleteByQueryResponse deleteByQueryResponse) { + return deleteByQueryResponse.deleted() > 0; + } + + /** + * 获取文档id, 如果文档中设置了id,使用文档的id,如果未设置,使用雪花算法生成 + * + * @param document + * @param + * @return + */ + private String getId(T document) { + Object objectId = ReflectUtils.getFieldValue(document, IdUtils.ID); + if (objectId == null) { + objectId = IdUtils.objectId(); + } + return objectId.toString(); + } + + +} diff --git a/framework/es/src/main/java/com/itmingchen/es/core/operations/DefaultIndexOperations.java b/framework/es/src/main/java/com/itmingchen/es/core/operations/DefaultIndexOperations.java new file mode 100644 index 0000000..a34f9cf --- /dev/null +++ b/framework/es/src/main/java/com/itmingchen/es/core/operations/DefaultIndexOperations.java @@ -0,0 +1,16 @@ +package com.itmingchen.es.core.operations; + +import co.elastic.clients.elasticsearch.ElasticsearchClient; +import lombok.extern.slf4j.Slf4j; + +/** + * @author itcast + */ +@Slf4j +public class DefaultIndexOperations implements IndexOperations{ + private final ElasticsearchClient elasticsearchClient; + + public DefaultIndexOperations(ElasticsearchClient elasticsearchClient) { + this.elasticsearchClient = elasticsearchClient; + } +} diff --git a/framework/es/src/main/java/com/itmingchen/es/core/operations/DocumentOperations.java b/framework/es/src/main/java/com/itmingchen/es/core/operations/DocumentOperations.java new file mode 100644 index 0000000..64d224d --- /dev/null +++ b/framework/es/src/main/java/com/itmingchen/es/core/operations/DocumentOperations.java @@ -0,0 +1,82 @@ +package com.itmingchen.es.core.operations; + +import com.itmingchen.common.model.PageResult; +import com.itmingchen.common.model.dto.PageQueryDTO; +import co.elastic.clients.elasticsearch.core.SearchRequest; +import co.elastic.clients.elasticsearch.core.SearchResponse; + +import java.util.List; + +/** + * @author itcast + */ +public interface DocumentOperations { + + /** + * 新增文档 + * + * @param index 文档所属索引 + * @param document 文档 + * @param document类型 + * @return 文档创建结果 + */ + Boolean insert(String index, T document); + + Boolean batchInsert(String index, List documents); + + Boolean batchUpsert(String index, List documents); + + Boolean updateById(String index, T document); + + Boolean deleteById(String index, ID id); + + /** + * 批量删除 + * @param index + * @param ids + * @return + * @param + */ + Boolean batchDelete(String index, List ids); + + T findById(String index, ID id, Class clazz); + + List findByIds(String index, List ids, Class clazz); + + List findByIds(String index, List ids, List includes, Class clazz); + + /** + * 还未写完 todo + * @param pageQueryDTO + * @param targetClass + * @return + * @param + */ + + PageResult findForPage(PageQueryDTO pageQueryDTO, Class targetClass); + + /** + * 根据条件使用经纬度范围检索,先经过条件筛选,然后距离查询 + * @param index + * @param searchBuilder + * @param location + * @param locationName + * @param distance + * @param sortBy + * @param isAsc + * @param size + * @return + * @param + */ + List searchByWithGeo(String index, + SearchRequest.Builder searchBuilder, + String locationName, + String location, + double distance, + String sortBy, + Boolean isAsc, + int size, + Class clazz); + + SearchResponse search(SearchRequest searchRequest, Class clazz); +} diff --git a/framework/es/src/main/java/com/itmingchen/es/core/operations/IndexOperations.java b/framework/es/src/main/java/com/itmingchen/es/core/operations/IndexOperations.java new file mode 100644 index 0000000..248afdf --- /dev/null +++ b/framework/es/src/main/java/com/itmingchen/es/core/operations/IndexOperations.java @@ -0,0 +1,4 @@ +package com.itmingchen.es.core.operations; + +public interface IndexOperations { +} diff --git a/framework/es/src/main/java/com/itmingchen/es/model/query/EsPageQuery.java b/framework/es/src/main/java/com/itmingchen/es/model/query/EsPageQuery.java new file mode 100644 index 0000000..22485dc --- /dev/null +++ b/framework/es/src/main/java/com/itmingchen/es/model/query/EsPageQuery.java @@ -0,0 +1,9 @@ +package com.itmingchen.es.model.query; + +import lombok.Data; + +@Data +public class EsPageQuery { + + +} diff --git a/framework/es/src/main/java/com/itmingchen/es/properties/EsProperties.java b/framework/es/src/main/java/com/itmingchen/es/properties/EsProperties.java new file mode 100644 index 0000000..09db049 --- /dev/null +++ b/framework/es/src/main/java/com/itmingchen/es/properties/EsProperties.java @@ -0,0 +1,19 @@ +package com.itmingchen.es.properties; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Configuration; + +@Configuration +@ConfigurationProperties(prefix = "itmingchen.es") +@Data +public class EsProperties { + /** + * es host + */ + private String host; + /** + * es 端口 + */ + private Integer port; +} diff --git a/framework/es/src/main/java/com/itmingchen/es/utils/DocumentUtils.java b/framework/es/src/main/java/com/itmingchen/es/utils/DocumentUtils.java new file mode 100644 index 0000000..edf6f0a --- /dev/null +++ b/framework/es/src/main/java/com/itmingchen/es/utils/DocumentUtils.java @@ -0,0 +1,38 @@ +package com.itmingchen.es.utils; + +import com.itmingchen.common.utils.BeanUtils; +import com.itmingchen.common.utils.CollUtils; +import org.elasticsearch.xcontent.XContentBuilder; +import org.elasticsearch.xcontent.XContentFactory; + +import java.io.IOException; +import java.util.Map; + +public class DocumentUtils { + + /** + * 不可用于集合 + * @param document + * @return + * @param + * @throws IOException + */ + public static XContentBuilder convert(T document) { + + Map map = BeanUtils.beanToMap(document); + if (CollUtils.isEmpty(map)) { + return null; + } + try { + XContentBuilder xContentBuilder = XContentFactory.jsonBuilder(); + for (Map.Entry entry : map.entrySet()) { + xContentBuilder.field(entry.getKey(), entry.getValue()); + } + return xContentBuilder.endObject(); + }catch (IOException e){ + return null; + } + + } + +} diff --git a/framework/es/src/main/java/com/itmingchen/es/utils/SearchResponseUtils.java b/framework/es/src/main/java/com/itmingchen/es/utils/SearchResponseUtils.java new file mode 100644 index 0000000..62f1862 --- /dev/null +++ b/framework/es/src/main/java/com/itmingchen/es/utils/SearchResponseUtils.java @@ -0,0 +1,45 @@ +package com.itmingchen.es.utils; + +import com.itmingchen.common.utils.CollUtils; +import com.itmingchen.common.utils.ObjectUtils; +import co.elastic.clients.elasticsearch.core.SearchResponse; +import co.elastic.clients.elasticsearch.core.search.Hit; + +import java.util.List; +import java.util.stream.Collectors; + +public class SearchResponseUtils { + + public static boolean isSuccess(SearchResponse searchResponse) { + return searchResponse != null && ObjectUtils.isNotEmpty(searchResponse.hits()) && CollUtils.isNotEmpty(searchResponse.hits().hits()); + } + + public static boolean isNotSuccess(SearchResponse searchResponse) { + return !isSuccess(searchResponse); + } + + public static List getResponse(SearchResponse searchResponse) { + return getResponse(searchResponse, null); + } + + + public static List getResponse(SearchResponse searchResponse, Convert convert) { + if (!isSuccess(searchResponse)) { + return null; + } + if (convert == null) { + return searchResponse.hits().hits().stream().map(hit -> hit.source()).collect(Collectors.toList()); + } + + return searchResponse.hits().hits() + .stream().map(hit -> { + convert.convert(hit, hit.source()); + return hit.source(); + }).collect(Collectors.toList()); + + } + + public static interface Convert { + void convert(Hit hit, T t); + } +} diff --git a/framework/es/src/main/java/com/itmingchen/es/utils/TermUtils.java b/framework/es/src/main/java/com/itmingchen/es/utils/TermUtils.java new file mode 100644 index 0000000..8334b84 --- /dev/null +++ b/framework/es/src/main/java/com/itmingchen/es/utils/TermUtils.java @@ -0,0 +1,21 @@ +package com.itmingchen.es.utils; + +import com.itmingchen.common.utils.CollUtils; +import co.elastic.clients.elasticsearch._types.FieldValue; + +import java.util.ArrayList; +import java.util.List; + +public class TermUtils { + + + + public static List parse(List sources) { + if (CollUtils.isEmpty(sources)) { + return null; + } + List values = new ArrayList<>(); + sources.stream().forEach(s -> values.add(FieldValue.of(s.toString()))); + return values; + } +} diff --git a/framework/es/src/main/resources/META-INF/spring.factories b/framework/es/src/main/resources/META-INF/spring.factories new file mode 100644 index 0000000..fd37c65 --- /dev/null +++ b/framework/es/src/main/resources/META-INF/spring.factories @@ -0,0 +1,2 @@ +org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ + com.itmingchen.es.config.EsConfiguration \ No newline at end of file diff --git a/framework/es/src/test/resources/application.yml b/framework/es/src/test/resources/application.yml new file mode 100644 index 0000000..6162983 --- /dev/null +++ b/framework/es/src/test/resources/application.yml @@ -0,0 +1,4 @@ +itmingchen: + es: + host: 192.168.101.65 + port: 9200 \ No newline at end of file diff --git a/framework/mvc/.gitignore b/framework/mvc/.gitignore new file mode 100644 index 0000000..5ff6309 --- /dev/null +++ b/framework/mvc/.gitignore @@ -0,0 +1,38 @@ +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### IntelliJ IDEA ### +.idea/modules.xml +.idea/jarRepositories.xml +.idea/compiler.xml +.idea/libraries/ +*.iws +*.iml +*.ipr + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store \ No newline at end of file diff --git a/framework/mvc/pom.xml b/framework/mvc/pom.xml new file mode 100644 index 0000000..76d8e4f --- /dev/null +++ b/framework/mvc/pom.xml @@ -0,0 +1,75 @@ + + + + parent + mingchen + 1.1-SNAPSHOT + ../parent + + 4.0.0 + + mvc + + + 11 + 11 + + + + + mingchen + common + 1.1-SNAPSHOT + + + org.apache.tomcat.embed + tomcat-embed-core + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-tomcat + + + + + + + org.springframework.boot + spring-boot-starter-undertow + + + + org.springframework + spring-webmvc + + + + io.swagger + swagger-annotations + provided + + + + org.aspectj + aspectjweaver + + + + org.springframework.cloud + spring-cloud-starter-openfeign + + + com.fasterxml.jackson.datatype + jackson-datatype-jsr310 + + + + + + \ No newline at end of file diff --git a/framework/mvc/src/main/java/com/itmingchen/mvc/advice/CommonExceptionAdvice.java b/framework/mvc/src/main/java/com/itmingchen/mvc/advice/CommonExceptionAdvice.java new file mode 100644 index 0000000..702c1f1 --- /dev/null +++ b/framework/mvc/src/main/java/com/itmingchen/mvc/advice/CommonExceptionAdvice.java @@ -0,0 +1,95 @@ +package com.itmingchen.mvc.advice; + +import com.itmingchen.common.constants.other.ErrorInfo; +import com.itmingchen.common.expcetions.CommonException; +import com.itmingchen.common.utils.*; +import com.itmingchen.mvc.constants.HeaderConstants; +import com.itmingchen.mvc.model.Result; +import com.itmingchen.mvc.utils.RequestUtils; +import com.itmingchen.mvc.utils.ResponseUtils; +import feign.FeignException; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.RestControllerAdvice; + +import static com.itmingchen.mvc.constants.HeaderConstants.BODY_PROCESSED; + +/** + * @author itcast + */ +@RestControllerAdvice +@Slf4j +public class CommonExceptionAdvice { + + + /** + * 捕获feign异常 + * @param e + * @return + */ + @ExceptionHandler({FeignException.class}) + public Result feignException(FeignException e) { + ResponseUtils.setResponseHeader(BODY_PROCESSED, "1"); + Object headerValue = e.responseHeaders().get(HeaderConstants.INNER_ERROR); + + if(RequestUtils.getRequest().getRequestURL().toString().contains("/inner/")) { + // 内部接口调用内部接口,异常抛出 + if(ObjectUtils.isNull(headerValue)) { + throw new CommonException(ErrorInfo.Msg.REQUEST_FAILD); + }else { + String encodeMsg = JsonUtils.parseArray(headerValue).getStr(0); + String[] msgs = Base64Utils.decodeStr(encodeMsg).split("\\|"); + throw new CommonException(NumberUtils.parseInt(msgs[0]), msgs[1]); + } + }else { + // 外部接口调用内部接口异常捕获 + if(ObjectUtils.isNull(headerValue)) { + return Result.error(ErrorInfo.Msg.REQUEST_FAILD); + }else { + String encodeMsg = JsonUtils.parseArray(headerValue).getStr(0); + String[] msgs = Base64Utils.decodeStr(encodeMsg).split("\\|"); + return Result.error(NumberUtils.parseInt(msgs[0]), msgs[1]); + } + } + } + + /** + * 自定义异常处理 + * @param e + * @return + */ + @ExceptionHandler({CommonException.class}) + public Result customException(CommonException e) { + log.error("请求异常,message:{},e", e.getMessage(),e); + // 标识异常已被处理 + ResponseUtils.setResponseHeader(BODY_PROCESSED, "1"); + if(RequestUtils.getRequest().getRequestURL().toString().contains("/inner/")) { + CommonException commonException = new CommonException(e.getCode(), e.getMessage()); + ResponseUtils.setResponseHeader(HeaderConstants.INNER_ERROR, Base64Utils.encodeStr(e.getCode() + "|" + e.getMessage())); + throw commonException; + } + return Result.error(e.getCode(), e.getMessage()); + } + + /** + * 非自定义异常处理 + * @param e 异常 + * @return + */ + @ExceptionHandler({Exception.class}) + public Result noCustomException(Exception e) { + log.error("请求异常,", e); + // 标识异常已被处理 + ResponseUtils.setResponseHeader(BODY_PROCESSED, "1"); + if(RequestUtils.getRequest().getRequestURL().toString().contains("/inner/")) { + CommonException commonException = new CommonException(ErrorInfo.Msg.REQUEST_FAILD); + + ResponseUtils.setResponseHeader(HeaderConstants.INNER_ERROR, Base64Utils.encodeStr( "500|" + ErrorInfo.Msg.REQUEST_FAILD)); + throw commonException; + } + return Result.error(ErrorInfo.Msg.REQUEST_FAILD); + } + + + +} diff --git a/framework/mvc/src/main/java/com/itmingchen/mvc/config/AutoConfiguration.java b/framework/mvc/src/main/java/com/itmingchen/mvc/config/AutoConfiguration.java new file mode 100644 index 0000000..64b129a --- /dev/null +++ b/framework/mvc/src/main/java/com/itmingchen/mvc/config/AutoConfiguration.java @@ -0,0 +1,11 @@ +package com.itmingchen.mvc.config; + +import com.itmingchen.mvc.handler.RequestIdHandlerImpl; +import com.itmingchen.mvc.handler.UserInfoHandlerImpl; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; + +@Configuration +@Import({RequestIdHandlerImpl.class, UserInfoHandlerImpl.class}) +public class AutoConfiguration { +} diff --git a/framework/mvc/src/main/java/com/itmingchen/mvc/config/CrosConfig.java b/framework/mvc/src/main/java/com/itmingchen/mvc/config/CrosConfig.java new file mode 100644 index 0000000..c3069f4 --- /dev/null +++ b/framework/mvc/src/main/java/com/itmingchen/mvc/config/CrosConfig.java @@ -0,0 +1,34 @@ +package com.itmingchen.mvc.config;//package com.itmingchen.mvc.config; +// +//import org.springframework.context.annotation.Bean; +//import org.springframework.context.annotation.Configuration; +//import org.springframework.web.cors.CorsConfiguration; +//import org.springframework.web.cors.UrlBasedCorsConfigurationSource; +//import org.springframework.web.filter.CorsFilter; +// +//import java.util.Collections; +// +///** +// * 解决apifox拉取api报错问题 +// */ +//@Configuration +//public class CrosConfig { +// +// @Bean +// public CorsFilter corsFilter() { +// // 跨域配置源 +// UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); +// //设置跨域的配置信息 +// CorsConfiguration corsConfiguration = new CorsConfiguration(); +// //1,允许任何来源 +// corsConfiguration.setAllowedOriginPatterns(Collections.singletonList("*")); +// //2,允许任何请求头 +// corsConfiguration.addAllowedHeader(CorsConfiguration.ALL); +// //3,允许任何方法 +// corsConfiguration.addAllowedMethod(CorsConfiguration.ALL); +// //4,允许凭证 +// corsConfiguration.setAllowCredentials(true); +// source.registerCorsConfiguration("/**", corsConfiguration); +// return new CorsFilter(source); +// } +//} diff --git a/framework/mvc/src/main/java/com/itmingchen/mvc/config/FilterConfiguration.java b/framework/mvc/src/main/java/com/itmingchen/mvc/config/FilterConfiguration.java new file mode 100644 index 0000000..5b749e2 --- /dev/null +++ b/framework/mvc/src/main/java/com/itmingchen/mvc/config/FilterConfiguration.java @@ -0,0 +1,13 @@ +package com.itmingchen.mvc.config; + +import com.itmingchen.mvc.filter.PackResultFilter; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; + +/** + * @author itcast + */ +@Configuration +@Import(PackResultFilter.class) +public class FilterConfiguration { +} diff --git a/framework/mvc/src/main/java/com/itmingchen/mvc/config/JsonConfig.java b/framework/mvc/src/main/java/com/itmingchen/mvc/config/JsonConfig.java new file mode 100644 index 0000000..4285961 --- /dev/null +++ b/framework/mvc/src/main/java/com/itmingchen/mvc/config/JsonConfig.java @@ -0,0 +1,43 @@ +package com.itmingchen.mvc.config; + +import com.itmingchen.common.utils.DateUtils; +import com.itmingchen.mvc.serialize.BigDecimalSerializer; +import com.itmingchen.mvc.serialize.LocalDateTimeSerializer; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; +import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer; +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; +import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import java.math.BigDecimal; +import java.math.BigInteger; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; + +import static com.itmingchen.common.utils.DateUtils.DEFAULT_DATE_TIME_FORMAT; + +/** + * @author itcast + */ +@Configuration +@ConditionalOnClass(ObjectMapper.class) +public class JsonConfig { + @Bean + public Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer() { + return jacksonObjectMapperBuilder -> { + DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_FORMAT); + jacksonObjectMapperBuilder.timeZone(DateUtils.TIME_ZONE_8); + jacksonObjectMapperBuilder.serializers(new com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer(dateTimeFormatter)); + jacksonObjectMapperBuilder.deserializers(new LocalDateTimeDeserializer(dateTimeFormatter)); + // long -> string + jacksonObjectMapperBuilder.serializerByType(Long.class, ToStringSerializer.instance); + jacksonObjectMapperBuilder.serializerByType(BigInteger.class, ToStringSerializer.instance); + // bigDecimal保留两位小数 + jacksonObjectMapperBuilder.serializerByType(BigDecimal.class, BigDecimalSerializer.instance); + // LocalDateTime 格式yyyy-MM-dd HH:mm:ss + jacksonObjectMapperBuilder.serializerByType(LocalDateTime.class, LocalDateTimeSerializer.instance); + }; + } +} diff --git a/framework/mvc/src/main/java/com/itmingchen/mvc/config/MvcConfig.java b/framework/mvc/src/main/java/com/itmingchen/mvc/config/MvcConfig.java new file mode 100644 index 0000000..b37cc99 --- /dev/null +++ b/framework/mvc/src/main/java/com/itmingchen/mvc/config/MvcConfig.java @@ -0,0 +1,31 @@ +package com.itmingchen.mvc.config; + + +import com.itmingchen.mvc.advice.CommonExceptionAdvice; +import com.itmingchen.mvc.interceptor.UserContextInteceptor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +@Configuration +@Slf4j +public class MvcConfig implements WebMvcConfigurer { + + /** + *

通用的ControllerAdvice异常处理器

+ */ + @Override + public void addInterceptors(InterceptorRegistry registry) { + // token拦截器 + registry.addInterceptor(new UserContextInteceptor()) + .addPathPatterns("/**"); + } + + @Bean + public CommonExceptionAdvice commonExceptionAdvice() { + return new CommonExceptionAdvice(); + } + +} diff --git a/framework/mvc/src/main/java/com/itmingchen/mvc/config/UserContextConfiguration.java b/framework/mvc/src/main/java/com/itmingchen/mvc/config/UserContextConfiguration.java new file mode 100644 index 0000000..7ccb496 --- /dev/null +++ b/framework/mvc/src/main/java/com/itmingchen/mvc/config/UserContextConfiguration.java @@ -0,0 +1,27 @@ +package com.itmingchen.mvc.config;//package com.itmingchen.mvc.config; +// +//import com.itmingchen.mvc.advice.CommonExceptionAdvice; +//import com.itmingchen.mvc.interceptor.UserContextInteceptor; +//import org.springframework.context.annotation.Bean; +//import org.springframework.context.annotation.Configuration; +//import org.springframework.web.servlet.config.annotation.InterceptorRegistry; +//import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; +// +///** +// * @author itcast +// */ +//@Configuration +//public class UserContextConfiguration implements WebMvcConfigurer { +// +// @Override +// public void addInterceptors(InterceptorRegistry registry) { +// // token拦截器 +// registry.addInterceptor(new UserContextInteceptor()) +// .addPathPatterns("/**"); +// } +// +// @Bean +// public CommonExceptionAdvice commonExceptionAdvice() { +// return new CommonExceptionAdvice(); +// } +//} diff --git a/framework/mvc/src/main/java/com/itmingchen/mvc/constants/HeaderConstants.java b/framework/mvc/src/main/java/com/itmingchen/mvc/constants/HeaderConstants.java new file mode 100644 index 0000000..8381984 --- /dev/null +++ b/framework/mvc/src/main/java/com/itmingchen/mvc/constants/HeaderConstants.java @@ -0,0 +1,10 @@ +package com.itmingchen.mvc.constants; + +public class HeaderConstants { + /** + * 判断响应参数是否已经处理,1:已经处理,其他未经处理 + */ + public static final String BODY_PROCESSED = "Processed-Mark"; + + public static final String INNER_ERROR = "INNER-ERROR"; +} diff --git a/framework/mvc/src/main/java/com/itmingchen/mvc/filter/PackResultFilter.java b/framework/mvc/src/main/java/com/itmingchen/mvc/filter/PackResultFilter.java new file mode 100644 index 0000000..579a6d9 --- /dev/null +++ b/framework/mvc/src/main/java/com/itmingchen/mvc/filter/PackResultFilter.java @@ -0,0 +1,52 @@ +package com.itmingchen.mvc.filter; + +import com.itmingchen.common.model.Result; +import com.itmingchen.common.utils.IoUtils; +import com.itmingchen.mvc.wrapper.ResponseWrapper; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import javax.servlet.*; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +import static com.itmingchen.mvc.constants.HeaderConstants.BODY_PROCESSED; + +/** + * 用于包装外网访问 + */ +@Component +@Slf4j +public class PackResultFilter implements Filter { + @Override + public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { + // 1.无需包装,放过拦截 + String requestURI = ((HttpServletRequest) servletRequest).getRequestURI(); + if (requestURI.contains(".") || + requestURI.contains("/swagger") || + requestURI.contains("/api-docs") || + requestURI.contains("/inner")) { + filterChain.doFilter(servletRequest, servletResponse); + return; + } + // 2.包装响应值 + // 2.1.处理业务,获取响应值 + HttpServletResponse response = (HttpServletResponse) servletResponse; + ResponseWrapper responseWrapper = new ResponseWrapper(response); + filterChain.doFilter(servletRequest, responseWrapper); + + // 无需包装 + if (response.containsHeader(BODY_PROCESSED) && response.getHeader(BODY_PROCESSED).equals("1")) { + IoUtils.write(response.getOutputStream(), false, responseWrapper.getResponseData()); + return; + } + + // 2.2.包装 + byte[] bytes = Result.plainOk(responseWrapper.getResponseData()); + log.debug("result : {}", new String(bytes)); + // 2.3.写入 + response.setContentType("applicaton/json;charset=UTF-8"); + IoUtils.write(response.getOutputStream(), false, bytes); + } +} diff --git a/framework/mvc/src/main/java/com/itmingchen/mvc/handler/RequestIdHandlerImpl.java b/framework/mvc/src/main/java/com/itmingchen/mvc/handler/RequestIdHandlerImpl.java new file mode 100644 index 0000000..0ae6198 --- /dev/null +++ b/framework/mvc/src/main/java/com/itmingchen/mvc/handler/RequestIdHandlerImpl.java @@ -0,0 +1,31 @@ +package com.itmingchen.mvc.handler; + +import cn.hutool.core.util.IdUtil; +import com.itmingchen.common.constants.other.HeaderConstants; +import com.itmingchen.common.handler.RequestIdHandler; +import com.itmingchen.common.model.CurrentUserInfo; +import com.itmingchen.common.utils.StringUtils; +import com.itmingchen.mvc.utils.RequestUtils; +import com.itmingchen.mvc.utils.UserContext; +import org.springframework.stereotype.Component; + +/** + * @author itcast + */ +@Component +public class RequestIdHandlerImpl implements RequestIdHandler { + @Override + public String getRequestId() { + // 从请求header头中获取请求id,获取不到id,生成新的请求id + CurrentUserInfo currentUserInfo = UserContext.currentUser(); + if(currentUserInfo == null) { + return null; + } + String requestId = RequestUtils.getValueFromHeader(HeaderConstants.REQUEST_ID); + if (StringUtils.isEmpty(requestId)) { + return IdUtil.getSnowflakeNextIdStr(); + } else { + return requestId; + } + } +} diff --git a/framework/mvc/src/main/java/com/itmingchen/mvc/handler/UserInfoHandlerImpl.java b/framework/mvc/src/main/java/com/itmingchen/mvc/handler/UserInfoHandlerImpl.java new file mode 100644 index 0000000..1863545 --- /dev/null +++ b/framework/mvc/src/main/java/com/itmingchen/mvc/handler/UserInfoHandlerImpl.java @@ -0,0 +1,14 @@ +package com.itmingchen.mvc.handler; + +import com.itmingchen.common.handler.UserInfoHandler; +import com.itmingchen.common.model.CurrentUserInfo; +import com.itmingchen.mvc.utils.UserContext; +import org.springframework.stereotype.Component; + +@Component +public class UserInfoHandlerImpl implements UserInfoHandler { + @Override + public CurrentUserInfo currentUserInfo() { + return UserContext.currentUser(); + } +} diff --git a/framework/mvc/src/main/java/com/itmingchen/mvc/interceptor/UserContextInteceptor.java b/framework/mvc/src/main/java/com/itmingchen/mvc/interceptor/UserContextInteceptor.java new file mode 100644 index 0000000..34f62d2 --- /dev/null +++ b/framework/mvc/src/main/java/com/itmingchen/mvc/interceptor/UserContextInteceptor.java @@ -0,0 +1,47 @@ +package com.itmingchen.mvc.interceptor; + +import com.itmingchen.common.constants.other.HeaderConstants; +import com.itmingchen.common.model.CurrentUserInfo; +import com.itmingchen.common.utils.Base64Utils; +import com.itmingchen.common.utils.JsonUtils; +import com.itmingchen.mvc.utils.UserContext; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.servlet.HandlerInterceptor; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +/** + * @author itcast + */ +@Slf4j +public class UserContextInteceptor implements HandlerInterceptor { + + @Override + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { + // 1.尝试获取头信息中的用户信息 + String userInfo = request.getHeader(HeaderConstants.USER_INFO); + // 2.判断是否为空 + if (userInfo == null) { + return true; + } + try { + // 3.base64解码用户信息 + String decodeUserInfo = Base64Utils.decodeStr(userInfo); + CurrentUserInfo currentUserInfo = JsonUtils.toBean(decodeUserInfo, CurrentUserInfo.class); + + // 4.转为用户id并保存 + UserContext.set(currentUserInfo); + return true; + } catch (NumberFormatException e) { + log.error("用户身份信息格式不正确,{}, 原因:{}", userInfo, e.getMessage()); + return true; + } + } + + @Override + public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { + // 清理用户信息 + UserContext.clear(); + } +} diff --git a/framework/mvc/src/main/java/com/itmingchen/mvc/model/Result.java b/framework/mvc/src/main/java/com/itmingchen/mvc/model/Result.java new file mode 100644 index 0000000..6427b63 --- /dev/null +++ b/framework/mvc/src/main/java/com/itmingchen/mvc/model/Result.java @@ -0,0 +1,53 @@ +package com.itmingchen.mvc.model; + +import cn.hutool.http.HttpStatus; +import com.itmingchen.common.constants.other.HeaderConstants; +import com.itmingchen.mvc.utils.RequestUtils; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +public class Result { + + public static final String REQUEST_OK = "OK"; + + @ApiModelProperty(value = "业务状态码,200-成功,其它-失败") + private int code; + @ApiModelProperty(value = "响应消息", example = "OK") + private String msg; + @ApiModelProperty(value = "响应数据") + private T data; + @ApiModelProperty(value = "请求id", example = "1af123c11412e") + private String requestId; + + public static Result ok() { + return new Result(HttpStatus.HTTP_OK, REQUEST_OK, null); + } + + public static Result ok(T data) { + return new Result<>(HttpStatus.HTTP_OK, REQUEST_OK, data); + } + + public static Result error(String msg) { + return new Result<>(HttpStatus.HTTP_BAD_REQUEST, msg, null); + } + + public static Result error(int code, String msg) { + return new Result<>(code, msg, null); + } + + public Result() { + this.requestId = RequestUtils.getValueFromHeader(HeaderConstants.REQUEST_ID); + } + + public Result(int code, String msg, T data) { + this.code = code; + this.msg = msg; + this.data = data; + this.requestId = RequestUtils.getValueFromHeader(HeaderConstants.REQUEST_ID); + } + + public boolean success() { + return code == HttpStatus.HTTP_OK; + } +} diff --git a/framework/mvc/src/main/java/com/itmingchen/mvc/serialize/BigDecimalSerializer.java b/framework/mvc/src/main/java/com/itmingchen/mvc/serialize/BigDecimalSerializer.java new file mode 100644 index 0000000..e6aca13 --- /dev/null +++ b/framework/mvc/src/main/java/com/itmingchen/mvc/serialize/BigDecimalSerializer.java @@ -0,0 +1,21 @@ +package com.itmingchen.mvc.serialize; + +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.databind.JsonSerializer; +import com.fasterxml.jackson.databind.SerializerProvider; + +import java.io.IOException; +import java.math.BigDecimal; +import java.math.RoundingMode; + +public class BigDecimalSerializer extends JsonSerializer { + public static final BigDecimalSerializer instance = new BigDecimalSerializer(); + + @Override + public void serialize(Object o, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException { + if (o != null && o instanceof BigDecimal) { + BigDecimal bigDecomal = (BigDecimal) o; + jsonGenerator.writeString(bigDecomal.setScale(2, RoundingMode.DOWN).toString()); + } + } +} diff --git a/framework/mvc/src/main/java/com/itmingchen/mvc/serialize/LocalDateTimeSerializer.java b/framework/mvc/src/main/java/com/itmingchen/mvc/serialize/LocalDateTimeSerializer.java new file mode 100644 index 0000000..2e4722f --- /dev/null +++ b/framework/mvc/src/main/java/com/itmingchen/mvc/serialize/LocalDateTimeSerializer.java @@ -0,0 +1,26 @@ +package com.itmingchen.mvc.serialize; + +import com.itmingchen.common.utils.DateUtils; +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.databind.JsonSerializer; +import com.fasterxml.jackson.databind.SerializerProvider; + +import java.io.IOException; +import java.time.LocalDateTime; + +/** + * @author 86188 + */ +public class LocalDateTimeSerializer extends JsonSerializer { + public static final LocalDateTimeSerializer instance = new LocalDateTimeSerializer(); + + @Override + public void serialize(Object o, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException { + if (o != null && o instanceof LocalDateTime) { + LocalDateTime time = (LocalDateTime) o; + jsonGenerator.writeString(DateUtils.format(time, DateUtils.DEFAULT_DATE_TIME_FORMAT)); + } + } + + +} diff --git a/framework/mvc/src/main/java/com/itmingchen/mvc/utils/RequestUtils.java b/framework/mvc/src/main/java/com/itmingchen/mvc/utils/RequestUtils.java new file mode 100644 index 0000000..b1db5bb --- /dev/null +++ b/framework/mvc/src/main/java/com/itmingchen/mvc/utils/RequestUtils.java @@ -0,0 +1,46 @@ +package com.itmingchen.mvc.utils; + +import com.itmingchen.common.utils.CollUtils; +import org.springframework.web.context.request.ServletRequestAttributes; + +import javax.servlet.http.HttpServletRequest; +import java.util.List; + +/** + * 请求工具 + * + * @author itcast + */ +public class RequestUtils { + + /** + * 获取当前线程请求对象 + * + * @return 请求对象 + */ + public static HttpServletRequest getRequest() { + ServletRequestAttributes servletRequestAttributes = ServletRequestAttributesUtils.getServletRequestAttributes(); + return servletRequestAttributes == null ? null : servletRequestAttributes.getRequest(); + } + + /** + * 从header头中获取一个header值 + * + * @param headerKey header头 + * @return header值 + */ + public static String getValueFromHeader(String headerKey) { + HttpServletRequest request = getRequest(); + return request == null ? null : request.getHeader(headerKey); + } + + /** + * 从header头像获取一个header的多个值列表 + * @param headerKey + * @return + */ + public static List getValuesFromHeader(String headerKey) { + HttpServletRequest request = getRequest(); + return request == null ? CollUtils.emptyList() : CollUtils.toList(request.getHeaders(headerKey)); + } +} diff --git a/framework/mvc/src/main/java/com/itmingchen/mvc/utils/ResponseUtils.java b/framework/mvc/src/main/java/com/itmingchen/mvc/utils/ResponseUtils.java new file mode 100644 index 0000000..9406b1f --- /dev/null +++ b/framework/mvc/src/main/java/com/itmingchen/mvc/utils/ResponseUtils.java @@ -0,0 +1,37 @@ +package com.itmingchen.mvc.utils; + +import org.springframework.web.context.request.ServletRequestAttributes; + +import javax.servlet.http.HttpServletResponse; + +/** + * 响应工具 + * + * @author itcast + */ +public class ResponseUtils { + + /** + * 获取response + * + * @return HttpServletResponse + */ + public static HttpServletResponse getResponse() { + ServletRequestAttributes servletRequestAttributes = ServletRequestAttributesUtils.getServletRequestAttributes(); + return servletRequestAttributes == null ? null : servletRequestAttributes.getResponse(); + } + + /** + * 设置响应header信息 + * + * @param key header key + * @param value header 值 + */ + public static void setResponseHeader(String key, String value) { + HttpServletResponse response = getResponse(); + if (response == null) { + return; + } + response.setHeader(key, value); + } +} diff --git a/framework/mvc/src/main/java/com/itmingchen/mvc/utils/ServletRequestAttributesUtils.java b/framework/mvc/src/main/java/com/itmingchen/mvc/utils/ServletRequestAttributesUtils.java new file mode 100644 index 0000000..6603c71 --- /dev/null +++ b/framework/mvc/src/main/java/com/itmingchen/mvc/utils/ServletRequestAttributesUtils.java @@ -0,0 +1,23 @@ +package com.itmingchen.mvc.utils; + +import org.springframework.web.context.request.RequestAttributes; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +/** + * @author itcast + */ +public class ServletRequestAttributesUtils { + + /** + * 获取 + * @return + */ + public static ServletRequestAttributes getServletRequestAttributes() { + RequestAttributes ra = RequestContextHolder.getRequestAttributes(); + if (ra == null) { + return null; + } + return (ServletRequestAttributes) ra; + } +} diff --git a/framework/mvc/src/main/java/com/itmingchen/mvc/utils/UserContext.java b/framework/mvc/src/main/java/com/itmingchen/mvc/utils/UserContext.java new file mode 100644 index 0000000..3f0bcd6 --- /dev/null +++ b/framework/mvc/src/main/java/com/itmingchen/mvc/utils/UserContext.java @@ -0,0 +1,41 @@ +package com.itmingchen.mvc.utils; + +import com.itmingchen.common.model.CurrentUserInfo; + +/** + * 用户信息上下文,主要存储用户id + * + * @author itcast + */ +public class UserContext { + private static final ThreadLocal THREAD_LOCAL_USER = new ThreadLocal<>(); + + /** + * 获取当前用户id + * + * @return 用户id + */ + public static Long currentUserId() { + return THREAD_LOCAL_USER.get().getId(); + } + + public static CurrentUserInfo currentUser() { + return THREAD_LOCAL_USER.get(); + } + + /** + * 设置当前用户id + * + * @param currentUserInfo 当前用户信息 + */ + public static void set(CurrentUserInfo currentUserInfo) { + THREAD_LOCAL_USER.set(currentUserInfo); + } + + /** + * 清理当前线程中的用户信息 + */ + public static void clear(){ + THREAD_LOCAL_USER.remove(); + } +} diff --git a/framework/mvc/src/main/java/com/itmingchen/mvc/wrapper/ResponseWrapper.java b/framework/mvc/src/main/java/com/itmingchen/mvc/wrapper/ResponseWrapper.java new file mode 100644 index 0000000..18633ed --- /dev/null +++ b/framework/mvc/src/main/java/com/itmingchen/mvc/wrapper/ResponseWrapper.java @@ -0,0 +1,95 @@ +package com.itmingchen.mvc.wrapper; + + +import javax.servlet.ServletOutputStream; +import javax.servlet.WriteListener; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpServletResponseWrapper; +import java.io.*; + +/** + * 重写response返回值 + * + * @author itcast + */ +public class ResponseWrapper extends HttpServletResponseWrapper { + private ByteArrayOutputStream buffer = null; + private ServletOutputStream out = null; + private PrintWriter writer = null; + + public ResponseWrapper(HttpServletResponse resp) throws IOException { + super(resp); + // 真正存储数据的流 + buffer = new ByteArrayOutputStream(); + out = new WapperedOutputStream(buffer); + writer = new PrintWriter(new OutputStreamWriter(buffer)); + } + + @Override + public ServletOutputStream getOutputStream() throws IOException { + return out; + } + + @Override + public PrintWriter getWriter() throws UnsupportedEncodingException { + return writer; + } + + @Override + public void flushBuffer() throws IOException { + if (out != null) { + out.flush(); + } + if (writer != null) { + writer.flush(); + } + } + + @Override + public void reset() { + buffer.reset(); + } + + public byte[] getResponseData() throws IOException { + flushBuffer(); + return buffer.toByteArray(); + } + + public String getContent() throws IOException{ + flushBuffer(); + return buffer.toString(); + } + + private class WapperedOutputStream extends ServletOutputStream { + private ByteArrayOutputStream bos = null; + + public WapperedOutputStream(ByteArrayOutputStream stream) throws IOException { + bos = stream; + } + + @Override + public void write(int b) throws IOException { + bos.write(b); + } + + @Override + public void write(byte[] b) throws IOException { + bos.write(b, 0, b.length); + } + + @Override + public void write(byte[] b, int off, int len) throws IOException { + bos.write(b, off, len); + } + + @Override + public boolean isReady() { + return false; + } + + @Override + public void setWriteListener(WriteListener writeListener) { + + } + } +} \ No newline at end of file diff --git a/framework/mvc/src/main/resources/META-INF/spring-configuration-metadata.json b/framework/mvc/src/main/resources/META-INF/spring-configuration-metadata.json new file mode 100644 index 0000000..799a9c6 --- /dev/null +++ b/framework/mvc/src/main/resources/META-INF/spring-configuration-metadata.json @@ -0,0 +1,9 @@ +{ + "groups": [ + + ], + "properties": [ + + ], + "hints": [] +} \ No newline at end of file diff --git a/framework/mvc/src/main/resources/META-INF/spring.factories b/framework/mvc/src/main/resources/META-INF/spring.factories new file mode 100644 index 0000000..3611a25 --- /dev/null +++ b/framework/mvc/src/main/resources/META-INF/spring.factories @@ -0,0 +1,5 @@ +org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ + com.itmingchen.mvc.config.FilterConfiguration, \ + com.itmingchen.mvc.config.JsonConfig, \ + com.itmingchen.mvc.config.MvcConfig, \ +com.itmingchen.mvc.config.AutoConfiguration \ No newline at end of file diff --git a/framework/mysql/.gitignore b/framework/mysql/.gitignore new file mode 100644 index 0000000..5ff6309 --- /dev/null +++ b/framework/mysql/.gitignore @@ -0,0 +1,38 @@ +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### IntelliJ IDEA ### +.idea/modules.xml +.idea/jarRepositories.xml +.idea/compiler.xml +.idea/libraries/ +*.iws +*.iml +*.ipr + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store \ No newline at end of file diff --git a/framework/mysql/pom.xml b/framework/mysql/pom.xml new file mode 100644 index 0000000..f84742e --- /dev/null +++ b/framework/mysql/pom.xml @@ -0,0 +1,59 @@ + + + + parent + mingchen + 1.1-SNAPSHOT + ../parent + + 4.0.0 + + mysql + + + 11 + 11 + + + + + + + com.baomidou + mybatis-plus-boot-starter + + + + mingchen + common + 1.1-SNAPSHOT + + + + org.springframework + spring-context + + + org.springframework.boot + spring-boot-autoconfigure + + + + org.springframework + spring-tx + + + + mysql + mysql-connector-java + + + com.github.pagehelper + pagehelper + + + + + \ No newline at end of file diff --git a/framework/mysql/src/main/java/com/itmingchen/mysql/config/MybatisPlusConfiguration.java b/framework/mysql/src/main/java/com/itmingchen/mysql/config/MybatisPlusConfiguration.java new file mode 100644 index 0000000..de37898 --- /dev/null +++ b/framework/mysql/src/main/java/com/itmingchen/mysql/config/MybatisPlusConfiguration.java @@ -0,0 +1,37 @@ +package com.itmingchen.mysql.config; + +import com.itmingchen.common.handler.UserInfoHandler; +import com.itmingchen.mysql.interceptor.MyBatisAutoFillInterceptor; +import com.itmingchen.mysql.properties.MybatisPlusProperties; +import com.baomidou.mybatisplus.annotation.DbType; +import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; +import com.baomidou.mybatisplus.extension.plugins.inner.DynamicTableNameInnerInterceptor; +import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +@EnableConfigurationProperties(MybatisPlusProperties.class) +public class MybatisPlusConfiguration { + + @Bean + @ConditionalOnMissingBean + public MybatisPlusInterceptor mybatisPlusInterceptor(@Autowired(required = false) DynamicTableNameInnerInterceptor innerInterceptor, UserInfoHandler userInfoHandler, MybatisPlusProperties mybatisPlusProperties) { + // 1.定义插件主体,注意顺序:表名 > 多租户 > 分页 > 乐观锁 > 字段填充 + MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); + // 2.表名插件 + if (innerInterceptor != null) { + interceptor.addInnerInterceptor(innerInterceptor); + } + // 3.分页插件 + PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor(DbType.MYSQL); + paginationInnerInterceptor.setMaxLimit(mybatisPlusProperties.getPage().getMaxLimit()); + interceptor.addInnerInterceptor(paginationInnerInterceptor); + // 4.字段填充插件 + interceptor.addInnerInterceptor(new MyBatisAutoFillInterceptor(userInfoHandler)); + return interceptor; + } +} diff --git a/framework/mysql/src/main/java/com/itmingchen/mysql/config/PageHelperConfiguration.java b/framework/mysql/src/main/java/com/itmingchen/mysql/config/PageHelperConfiguration.java new file mode 100644 index 0000000..a1db0dd --- /dev/null +++ b/framework/mysql/src/main/java/com/itmingchen/mysql/config/PageHelperConfiguration.java @@ -0,0 +1,14 @@ +package com.itmingchen.mysql.config; + +import com.github.pagehelper.PageInterceptor; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class PageHelperConfiguration { + + @Bean + public PageInterceptor pageInterceptor() { + return new PageInterceptor(); + } +} diff --git a/framework/mysql/src/main/java/com/itmingchen/mysql/constants/DbFiledConstants.java b/framework/mysql/src/main/java/com/itmingchen/mysql/constants/DbFiledConstants.java new file mode 100644 index 0000000..2e9f3fa --- /dev/null +++ b/framework/mysql/src/main/java/com/itmingchen/mysql/constants/DbFiledConstants.java @@ -0,0 +1,18 @@ +package com.itmingchen.mysql.constants; + +public interface DbFiledConstants { + + /** + * 数据字段 - ID + */ + String ID = "id"; + /** + * 数据字段 - 创建人 + */ + String CREATE_BY = "createBy"; + + /** + * 数据字段 - 更新人 + */ + String UPDATE_BY = "updateBy"; +} diff --git a/framework/mysql/src/main/java/com/itmingchen/mysql/interceptor/MyBatisAutoFillInterceptor.java b/framework/mysql/src/main/java/com/itmingchen/mysql/interceptor/MyBatisAutoFillInterceptor.java new file mode 100644 index 0000000..65a4efc --- /dev/null +++ b/framework/mysql/src/main/java/com/itmingchen/mysql/interceptor/MyBatisAutoFillInterceptor.java @@ -0,0 +1,71 @@ +package com.itmingchen.mysql.interceptor; + +import com.itmingchen.common.handler.UserInfoHandler; +import com.itmingchen.common.model.CurrentUserInfo; +import com.itmingchen.common.utils.ObjectUtils; +import com.itmingchen.common.utils.ReflectUtils; +import com.baomidou.mybatisplus.extension.plugins.inner.InnerInterceptor; +import org.apache.ibatis.executor.Executor; +import org.apache.ibatis.mapping.MappedStatement; +import org.apache.ibatis.mapping.SqlCommandType; + +import java.sql.SQLException; + +import static com.itmingchen.mysql.constants.DbFiledConstants.CREATE_BY; +import static com.itmingchen.mysql.constants.DbFiledConstants.UPDATE_BY; + +/** + * @author itcast + */ +public class MyBatisAutoFillInterceptor implements InnerInterceptor { + + private final UserInfoHandler userInfoHandler; + + public MyBatisAutoFillInterceptor(UserInfoHandler userInfoHandler) { + this.userInfoHandler = userInfoHandler; + } + + @Override + public void beforeUpdate(Executor executor, MappedStatement ms, Object parameter) throws SQLException { + //1.更新操作 + updateExe(parameter); + //2.插入操作 + insertExe(ms, parameter); + } + + private void insertExe(MappedStatement ms, Object parameter){ + //1.判断当前操作是否是插入操作 + if(ms.getSqlCommandType().compareTo(SqlCommandType.INSERT) == 0) { + //2.判断是否有updater字段,如果 + if(ObjectUtils.isNotNull(parameter) && ReflectUtils.containField(CREATE_BY, parameter.getClass())){ + + //3.有userId也存在并设置updater + Long userId = currentUserId(); + if(ObjectUtils.isNotNull(userId)){ + //4.当前操作人设置到创建人字段 + ReflectUtils.setFieldValue(parameter, CREATE_BY, currentUserId()); + } + } + } + } + + private void updateExe(Object parameter){ + //1.判断是否有updater字段 + if(ObjectUtils.isNotNull(parameter) && ReflectUtils.containField(UPDATE_BY, parameter.getClass())){ + Long userId = currentUserId(); + //2.如果有userId也存在并设置updater + if(ObjectUtils.isNotNull(userId)){ + //3.当前用户设置到更新人字段 + ReflectUtils.setFieldValue(parameter, UPDATE_BY, userId); + } + } + } + + private Long currentUserId() { + if(ObjectUtils.isNull(userInfoHandler)){ + return null; + } + CurrentUserInfo currentUserInfo = userInfoHandler.currentUserInfo(); + return currentUserInfo != null ? currentUserInfo.getId() : null; + } +} diff --git a/framework/mysql/src/main/java/com/itmingchen/mysql/properties/MybatisPlusProperties.java b/framework/mysql/src/main/java/com/itmingchen/mysql/properties/MybatisPlusProperties.java new file mode 100644 index 0000000..da92050 --- /dev/null +++ b/framework/mysql/src/main/java/com/itmingchen/mysql/properties/MybatisPlusProperties.java @@ -0,0 +1,22 @@ +package com.itmingchen.mysql.properties; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Configuration; + +/** + * @author itcast + */ +@Configuration +@ConfigurationProperties(prefix = "mybatis-plus") +@Data +public class MybatisPlusProperties { + private Page page = new Page(); + @Data + public static class Page { + /** + * 默认最大分页200条 + */ + private Long maxLimit = 200L; + } +} diff --git a/framework/mysql/src/main/java/com/itmingchen/mysql/utils/PageHelperUtils.java b/framework/mysql/src/main/java/com/itmingchen/mysql/utils/PageHelperUtils.java new file mode 100644 index 0000000..cad718d --- /dev/null +++ b/framework/mysql/src/main/java/com/itmingchen/mysql/utils/PageHelperUtils.java @@ -0,0 +1,66 @@ +package com.itmingchen.mysql.utils; + +import com.github.pagehelper.Page; +import com.github.pagehelper.PageHelper; +import com.itmingchen.common.model.PageResult; +import com.itmingchen.common.model.dto.PageQueryDTO; +import com.itmingchen.common.utils.CollUtils; +import com.itmingchen.common.utils.StringUtils; + +import java.util.List; + +/** + * 底层使用pageHelper实现的分页查询 + * + */ +public class PageHelperUtils { + + /** + * 分页查询数据 + * + * @param pageQueryDTO + * @param condition + * @return + */ + public static PageResult selectPage(PageQueryDTO pageQueryDTO, QueryExecutor condition) { + + PageHelper.startPage(pageQueryDTO.getPageNo().intValue(), pageQueryDTO.getPageSize().intValue(), getOrder(pageQueryDTO)); + List data = condition.query(); + if (data instanceof Page) { + Page page = (Page) data; + return new PageResult<>(page.getPages() * 1L, page.getTotal(), data); + } + long total = CollUtils.size(data); + long pages = total % pageQueryDTO.getPageSize() == 0 ? total / pageQueryDTO.getPageSize() : total / pageQueryDTO.getPageSize() + 1; + return new PageResult<>(pages, total, data); + } + + private static String getOrder(PageQueryDTO pageQueryDTO) { + if (StringUtils.isEmpty(pageQueryDTO.getOrderBy1()) && StringUtils.isEmpty(pageQueryDTO.getOrderBy2())) { + return null; + } + StringBuffer buffer = new StringBuffer(" "); + if (StringUtils.isNotEmpty(pageQueryDTO.getOrderBy1())) { + buffer.append(StringUtils.toSymbolCase(pageQueryDTO.getOrderBy1(), '_')) + .append(pageQueryDTO.getIsAsc1() ? " asc " : " desc "); + } + if (StringUtils.isNotEmpty(pageQueryDTO.getOrderBy2())) { + // 两个排序项需要中间添加“,” + if (StringUtils.isNotEmpty(pageQueryDTO.getOrderBy1())) { + buffer.append(","); + } + buffer.append(StringUtils.toSymbolCase(pageQueryDTO.getOrderBy2(), '_')) + .append(pageQueryDTO.getIsAsc2() ? " asc " : " desc "); + } + return buffer.toString(); + } + + /** + * 查询执行器 + * + * @param + */ + public interface QueryExecutor { + List query(); + } +} diff --git a/framework/mysql/src/main/java/com/itmingchen/mysql/utils/PageUtils.java b/framework/mysql/src/main/java/com/itmingchen/mysql/utils/PageUtils.java new file mode 100644 index 0000000..8b6651c --- /dev/null +++ b/framework/mysql/src/main/java/com/itmingchen/mysql/utils/PageUtils.java @@ -0,0 +1,139 @@ +package com.itmingchen.mysql.utils; + +import com.itmingchen.common.handler.ConvertHandler; +import com.itmingchen.common.model.PageResult; +import com.itmingchen.common.model.dto.PageQueryDTO; +import com.itmingchen.common.utils.BeanUtils; +import com.itmingchen.common.utils.CollUtils; +import com.itmingchen.common.utils.ObjectUtils; +import com.itmingchen.common.utils.StringUtils; +import com.baomidou.mybatisplus.core.metadata.OrderItem; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; + +import java.util.ArrayList; +import java.util.List; + +/** + * 分页工具 + * + * @ClassName PageUtils + * @Author wusongsong + * @Date 2022/6/27 17:19 + * @Version + **/ +public class PageUtils { + + /** + * mybatis的分页数据是否为空 + * + * @param page + * @return + */ + public static boolean isEmpty(Page page) { + return page == null || CollUtils.isEmpty(page.getRecords()); + } + + /** + * 判断mybatis的分页数据不为空 + * + * @param page + * @return + */ + public static boolean isNotEmpty(Page page) { + return page != null && !CollUtils.isEmpty(page.getRecords()); + } + + /** + * 分页数据转换,主要场景是从数据库中查出来的数据转换成DTO,或者VO + * + * @param originPage 从数据库查询出来的分页数据 + * @param targetClazz 目标对象class + * @param convertHandler 数据库对象转换DTO或者VO的转换器,用于转换复杂的数据 + * @param 目标对象类型 + * @param 源对象类型 + * @return 用于传递的分页数据 + */ + public static PageResult toPage(Page originPage, Class targetClazz, ConvertHandler convertHandler) { + if (isEmpty(originPage)) { + return new PageResult<>(0L, 0L, new ArrayList<>()); + } + + return new PageResult<>(originPage.getPages(), originPage.getTotal(), + BeanUtils.copyToList(originPage.getRecords(), targetClazz, convertHandler)); + } + + /** + * 分页数据转换返给其他微服务,主要场景是从数据库中查出来的数据转换成DTO,或者VO + * + * @param originPage 从数据库查询出来的分页数据 + * @param targetClazz 目标对象class + * @param 目标对象类型 + * @param 源对象类型 + * @return 用于传递的分页数据 + */ + public static PageResult toPage(Page originPage, Class targetClazz) { + if (isEmpty(originPage)) { + return new PageResult<>(0L, 0L, new ArrayList<>()); + } + + return new PageResult<>(originPage.getPages(), originPage.getTotal(), + BeanUtils.copyToList(originPage.getRecords(), targetClazz)); + } + + + /** + * 将前端传来的分页查询条件转换成数据库的查询page, + * 如果进行排序必须填写targetClazz + * 该方法支持简单的数据字段排序,不支持统计排序 + * + * @param pageQueryDTO 前端传来的查询条件 + * @param 查询数据库po + * @param targetClazz 校验数据库中是否有需要排序的字段 + * @return mybatis-plus 分页查询page + */ + public static Page parsePageQuery(PageQueryDTO pageQueryDTO, Class targetClazz) { + Page page = new Page<>(pageQueryDTO.getPageNo(), pageQueryDTO.getPageSize()); + //是否排序 + if (targetClazz != null) { + List orderItems = getOrderItems(pageQueryDTO, targetClazz); + if (CollUtils.isNotEmpty(orderItems)) { + page.addOrder(orderItems); + } + } else { + //如果没有更新时间按照添加逆序排序 + OrderItem orderItem = new OrderItem(); + orderItem.setAsc(false); + orderItem.setColumn("id"); + page.addOrder(orderItem); + + } + return page; + } + + public static List getOrderItems(PageQueryDTO pageQueryDTO, Class targetClazz) { + List orderItems = new ArrayList<>(); + if (ObjectUtils.isEmpty(pageQueryDTO)) { + return orderItems; + } + // 排序字段1 + if (StringUtils.isNotEmpty(pageQueryDTO.getOrderBy1())) { + OrderItem orderItem = new OrderItem(); + orderItem.setColumn(StringUtils.toSymbolCase(pageQueryDTO.getOrderBy1(), '_')); + orderItem.setAsc(pageQueryDTO.getIsAsc1()); + orderItems.add(orderItem); + } + // 排序字段2 + if (StringUtils.isNotEmpty(pageQueryDTO.getOrderBy2())) { + OrderItem orderItem = new OrderItem(); + orderItem.setColumn(StringUtils.toSymbolCase(pageQueryDTO.getOrderBy2(), '_')); + orderItem.setAsc(pageQueryDTO.getIsAsc2()); + orderItems.add(orderItem); + } + return orderItems; + } + + public static Long pages(Long total, Long pageSize) { + return total % pageSize == 0 ? total / pageSize : total / pageSize + 1; + } + +} diff --git a/framework/mysql/src/main/resources/META-INF/spring-configuration-metadata.json b/framework/mysql/src/main/resources/META-INF/spring-configuration-metadata.json new file mode 100644 index 0000000..799a9c6 --- /dev/null +++ b/framework/mysql/src/main/resources/META-INF/spring-configuration-metadata.json @@ -0,0 +1,9 @@ +{ + "groups": [ + + ], + "properties": [ + + ], + "hints": [] +} \ No newline at end of file diff --git a/framework/mysql/src/main/resources/META-INF/spring.factories b/framework/mysql/src/main/resources/META-INF/spring.factories new file mode 100644 index 0000000..64f03c4 --- /dev/null +++ b/framework/mysql/src/main/resources/META-INF/spring.factories @@ -0,0 +1,3 @@ +org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ + com.itmingchen.mysql.config.MybatisPlusConfiguration,\ + com.itmingchen.mysql.config.PageHelperConfiguration diff --git a/framework/parent/.gitignore b/framework/parent/.gitignore new file mode 100644 index 0000000..5ff6309 --- /dev/null +++ b/framework/parent/.gitignore @@ -0,0 +1,38 @@ +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### IntelliJ IDEA ### +.idea/modules.xml +.idea/jarRepositories.xml +.idea/compiler.xml +.idea/libraries/ +*.iws +*.iml +*.ipr + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store \ No newline at end of file diff --git a/framework/parent/pom.xml b/framework/parent/pom.xml new file mode 100644 index 0000000..b99e2a8 --- /dev/null +++ b/framework/parent/pom.xml @@ -0,0 +1,378 @@ + + + 4.0.0 + pom + + + + + + ../common + ../mysql + + ../xxl-job + ../mvc + ../redis + + ../es + ../rabbitmq + + + + + + + + + mingchen + parent + 1.1-SNAPSHOT + mingchen + mingchen 架构框架 + + + 11 + 11 + UTF-8 + + UTF-8 + UTF-8 + + UTF-8 + 11 + 1.1-SNAPSHOT + 1.18.26 + 1.7.30 + 5.7.18 + 3.4.3 + 2.7.10 + 3.1.1 + 2021.0.4 + 2021.0.1.0 + 3.0.3 + 1.5.22 + 3.17.7 + 1.9.8.M1 + 4.0.1 + 6.0.18.Final + + 7.17.7 + 2.14.2 + 2.0.1 + 5.1.11 + 1.1.5 + 5.4.0 + 1.33 + 1.2.14.RELEASE + 2.5.1 + 2.3.0 + 4.2.0 + 1.5.2 + 3.5.3 + 3.2.0 + 1.8.5 + + + + org.springframework.boot + spring-boot-starter-parent + 2.7.10 + + + + + + org.projectlombok + lombok + ${lombok.version} + + + + org.slf4j + slf4j-api + ${slf4j.version} + + + + + + + + + + + + + + + + + + + com.baomidou + mybatis-plus-boot-starter + ${mybatis-plus.version} + + + com.baomidou + mybatis-plus-core + ${mybatis-plus.version} + + + com.baomidou + mybatis-plus-extension + ${mybatis-plus.version} + + + + + org.springframework.boot + spring-boot-dependencies + ${spring-boot.version} + + + + org.springframework.cloud + spring-cloud-dependencies + ${spring-cloud.version} + pom + import + + + + + io.swagger + swagger-annotations + ${swagger-annotations.version} + + + + org.redisson + redisson + ${reddsion.version} + + + + org.elasticsearch.client + elasticsearch-rest-high-level-client + ${es.version} + + + co.elastic.clients + elasticsearch-java + ${es.version} + + + org.aspectj + aspectjweaver + ${aspectj.version} + + + + org.hibernate.validator + hibernate-validator + ${validator.version} + + + + org.springframework.boot + spring-boot-starter-web + ${spring-boot.version} + + + mysql + mysql-connector-java + ${mysql.version} + + + + + cn.hutool + hutool-all + ${hutool.version} + + + + + com.fasterxml.jackson.core + jackson-databind + ${jackson.version} + + + + jakarta.json + jakarta.json-api + ${jakarta.json-ai.version} + + + com.github.pagehelper + pagehelper + ${pagehelper.version} + + + + + org.yaml + snakeyaml + ${snakeyaml.version} + + + + + + + + + + + + + + + + + + + + com.xuxueli + xxl-job-core + ${xxl-job.version} + + + + + + + + mingchen + common + 1.1-SNAPSHOT + + + + + + + + mingchen + es + ${itmingchen.version} + + + mingchen + mvc + ${itmingchen.version} + + + mingchen + mysql + 1.1-SNAPSHOT + + + mingchen + rabbitmq + 1.1-SNAPSHOT + + + mingchen + redis + 1.1-SNAPSHOT + + + + + + + + + + + + + mingchen + xxl-job + 1.1-SNAPSHOT + + + + + + + + + + + + + + + + + + + + + + + + + + + + org.springframework.boot + spring-boot-starter-cache + ${spring-boot.version} + + + seata-spring-boot-starter + io.seata + ${seata-version} + + + + + + + + + + + + + + + + + + + + + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.8.1 + + 11 + 11 + + + + + org.apache.maven.plugins + maven-surefire-plugin + + true + + + + + + \ No newline at end of file diff --git a/framework/rabbitmq/.gitignore b/framework/rabbitmq/.gitignore new file mode 100644 index 0000000..5ff6309 --- /dev/null +++ b/framework/rabbitmq/.gitignore @@ -0,0 +1,38 @@ +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### IntelliJ IDEA ### +.idea/modules.xml +.idea/jarRepositories.xml +.idea/compiler.xml +.idea/libraries/ +*.iws +*.iml +*.ipr + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store \ No newline at end of file diff --git a/framework/rabbitmq/pom.xml b/framework/rabbitmq/pom.xml new file mode 100644 index 0000000..779d3b8 --- /dev/null +++ b/framework/rabbitmq/pom.xml @@ -0,0 +1,37 @@ + + + + parent + mingchen + 1.1-SNAPSHOT + ../parent + + 4.0.0 + + rabbitmq + + + 11 + 11 + + + + + mingchen + common + 1.1-SNAPSHOT + + + org.springframework.boot + spring-boot-starter-amqp + + + com.baomidou + mybatis-plus-core + provided + + + + \ No newline at end of file diff --git a/framework/rabbitmq/src/main/java/com/itmingchen/rabbitmq/client/RabbitClient.java b/framework/rabbitmq/src/main/java/com/itmingchen/rabbitmq/client/RabbitClient.java new file mode 100644 index 0000000..d1b58c4 --- /dev/null +++ b/framework/rabbitmq/src/main/java/com/itmingchen/rabbitmq/client/RabbitClient.java @@ -0,0 +1,125 @@ +package com.itmingchen.rabbitmq.client; + +import cn.hutool.core.exceptions.ExceptionUtil; +import cn.hutool.core.util.CharsetUtil; +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.StrUtil; +import com.itmingchen.common.expcetions.MqException; +import com.itmingchen.common.utils.DateUtils; +import com.itmingchen.common.utils.JsonUtils; +import com.itmingchen.common.utils.NumberUtils; +import com.itmingchen.rabbitmq.dao.FailMsgDao; +import com.itmingchen.rabbitmq.plugins.DelayMessagePostProcessor; +import com.itmingchen.rabbitmq.plugins.RabbitMqListenableFutureCallback; +import lombok.extern.slf4j.Slf4j; +import org.springframework.amqp.core.Message; +import org.springframework.amqp.core.MessageBuilder; +import org.springframework.amqp.core.MessageDeliveryMode; +import org.springframework.amqp.rabbit.connection.CorrelationData; +import org.springframework.amqp.rabbit.core.RabbitTemplate; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.retry.annotation.Backoff; +import org.springframework.retry.annotation.Recover; +import org.springframework.retry.annotation.Retryable; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; + +/** + * 消息处理类 + * + * @author zzj + * @version 1.0 + */ +@Slf4j +@Service +public class RabbitClient { + + @Resource + private RabbitTemplate rabbitTemplate; + @Autowired(required = false) + private FailMsgDao failMsgDao; + + @Resource + private RabbitClient rabbitClient; + + + public void sendMsg(String exchange, String routingKey, Object msg) { + rabbitClient.sendMsg(exchange, routingKey, msg, null, null, false); + } + + /** + * 发送消息 重试3次 + * + * @param exchange 交换机 + * @param routingKey 路由key + * @param msg 消息对象,会将对象序列化成json字符串发出 + * @param delay 延迟时间 秒 + * @param msgId 消息id + * @param isFailMsg 是否是失败消息 + * @return 是否发送成功 + */ + @Retryable(value = MqException.class, maxAttempts = 3, backoff = @Backoff(value = 3000, multiplier = 1.5), recover = "saveFailMag") + public void sendMsg(String exchange, String routingKey, Object msg, Integer delay, Long msgId, boolean isFailMsg) { + // 1.发送消息前准备 + // 1.1获取消息内容,如果非字符串将其序列化 + String jsonMsg = JsonUtils.toJsonStr(msg); + // 1.2.全局唯一消息id,如果调用者设置了消息id,使用调用者消息id,如果为配置,默认雪花算法生成消息id + msgId = NumberUtils.null2Default(msgId, IdUtil.getSnowflakeNextId()); + // 1.3.设置默认延迟时间,默认立即发送 + delay = NumberUtils.null2Default(delay, -1); + log.debug("消息发送!exchange = {}, routingKey = {}, msg = {}, msgId = {}", exchange, routingKey, jsonMsg, msgId); + + + // 1.4.构建回调 + RabbitMqListenableFutureCallback futureCallback = RabbitMqListenableFutureCallback.builder() + .exchange(exchange) + .routingKey(routingKey) + .msg(jsonMsg) + .msgId(msgId) + .delay(delay) + .isFailMsg(isFailMsg) + .failMsgDao(failMsgDao) + .build(); + // 1.5.CorrelationData设置 + CorrelationData correlationData = new CorrelationData(msgId.toString()); + correlationData.getFuture().addCallback(futureCallback); + + // 1.6.构造消息对象 + Message message = MessageBuilder.withBody(StrUtil.bytes(jsonMsg, CharsetUtil.CHARSET_UTF_8)) + //持久化 + .setDeliveryMode(MessageDeliveryMode.PERSISTENT) + //消息id + .setMessageId(msgId.toString()) + .build(); + + try { + // 2.发送消息 + this.rabbitTemplate.convertAndSend(exchange, routingKey, message, new DelayMessagePostProcessor(delay), correlationData); + } catch (Exception e) { + log.error("send error:" + e); + // 3.构建异常回调,并抛出异常 + MqException mqException = new MqException(); + mqException.setMsg(ExceptionUtil.getMessage(e)); + mqException.setMqId(msgId); + throw mqException; + } + } + + + /** + * @param mqException mq异常消息 + * @param exchange 交换机 + * @param routingKey 路由key + * @param msg mq消息 + * @param delay 延迟消息 + * @param msgId 消息id + */ + @Recover + public void saveFailMag(MqException mqException, String exchange, String routingKey, Object msg, Integer delay, String msgId) { + //发送消息失败,需要将消息持久化到数据库,通过任务调度的方式处理失败的消息 + failMsgDao.save(mqException.getMqId(), exchange, routingKey, JsonUtils.toJsonStr(msg), delay, DateUtils.getCurrentTime() + 10, ExceptionUtil.getMessage(mqException)); + } + + +} diff --git a/framework/rabbitmq/src/main/java/com/itmingchen/rabbitmq/config/RabbitMqConfiguration.java b/framework/rabbitmq/src/main/java/com/itmingchen/rabbitmq/config/RabbitMqConfiguration.java new file mode 100644 index 0000000..24eeac3 --- /dev/null +++ b/framework/rabbitmq/src/main/java/com/itmingchen/rabbitmq/config/RabbitMqConfiguration.java @@ -0,0 +1,123 @@ +package com.itmingchen.rabbitmq.config; + +import com.itmingchen.common.utils.DateUtils; +import com.itmingchen.common.utils.NumberUtils; +import com.itmingchen.rabbitmq.client.RabbitClient; +import com.itmingchen.rabbitmq.dao.FailMsgDao; +import com.itmingchen.rabbitmq.dao.impl.FailMsgDaoImpl; +import com.itmingchen.rabbitmq.plugins.ErrorMessageRecoverer; +import com.itmingchen.rabbitmq.plugins.RabbitMqResender; +import com.itmingchen.rabbitmq.properties.RabbitmqProperties; +import lombok.extern.slf4j.Slf4j; +import org.springframework.amqp.core.*; +import org.springframework.amqp.rabbit.config.SimpleRabbitListenerContainerFactory; +import org.springframework.amqp.rabbit.connection.ConnectionFactory; +import org.springframework.amqp.rabbit.core.RabbitAdmin; +import org.springframework.amqp.rabbit.core.RabbitTemplate; +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.amqp.SimpleRabbitListenerContainerFactoryConfigurer; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; +import org.springframework.context.annotation.Primary; + +import java.nio.charset.Charset; + +/** + * @author itcast + */ +@Configuration +@ConditionalOnProperty(prefix = "rabbit-mq", name = "enable", havingValue = "true") +@Import({RabbitClient.class, FailMsgDaoImpl.class}) +@EnableConfigurationProperties({RabbitmqProperties.class}) +@Slf4j +public class RabbitMqConfiguration implements ApplicationContextAware { + + + /** + * 并发数量 + */ + public static final int DEFAULT_CONCURRENT = 10; + + @Autowired(required = false) + private FailMsgDao failMsgDao; + + @Bean + public ErrorMessageRecoverer errorMessageRecoverer(RabbitmqProperties rabbitmqProperties,RabbitClient rabbitClient) { + return new ErrorMessageRecoverer(rabbitClient, rabbitmqProperties); + } + + @Bean + public RabbitMqResender rabbitMqResender(RabbitTemplate rabbitTemplate, RabbitmqProperties rabbitmqProperties) { + return new RabbitMqResender(rabbitTemplate, rabbitmqProperties); + } + /** + * 自定义mq消费者并发连接 + * + * @param configurer configurer + * @param connectionFactory connectionFactory + * @return factory + */ + @Bean("defaultContainerFactory") + @Primary + public SimpleRabbitListenerContainerFactory containerFactory(SimpleRabbitListenerContainerFactoryConfigurer configurer, + ConnectionFactory connectionFactory, + RabbitmqProperties rabbitmqProperties) { + SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory(); + factory.setConcurrentConsumers(DEFAULT_CONCURRENT); + factory.setMaxConcurrentConsumers(DEFAULT_CONCURRENT); + configurer.configure(factory, connectionFactory); + + RabbitAdmin rabbitAdmin = new RabbitAdmin(connectionFactory); + // 声明消费异常交换机 + Exchange errorExchange = ExchangeBuilder.topicExchange(rabbitmqProperties.getError().getExchange()) + .durable(true).build(); + rabbitAdmin.declareExchange(errorExchange); + rabbitAdmin.setAutoStartup(true); + // 声明消费异常队列 + Queue errorQueue = new Queue(rabbitmqProperties.getError().getQueue()); + rabbitAdmin.declareQueue(errorQueue); + // 声明消费异常消息绑定关系 + Binding binding = BindingBuilder.bind(errorQueue) + .to(errorExchange) + .with(rabbitmqProperties.getError().getRoutingKey()).noargs(); + rabbitAdmin.declareBinding(binding); + return factory; + } + + + + @Override + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { + // 获取RabbitTemplate + RabbitTemplate rabbitTemplate = applicationContext.getBean(RabbitTemplate.class); + //定义returnCallback回调方法 + rabbitTemplate.setReturnsCallback( + new RabbitTemplate.ReturnsCallback() { + @Override + public void returnedMessage(ReturnedMessage returnedMessage) { + byte[] body = returnedMessage.getMessage().getBody(); + //消息id + String messageId = returnedMessage.getMessage().getMessageProperties().getMessageId(); + String content = new String(body, Charset.defaultCharset()); + log.info("消息发送失败,应答码{},原因{},交换机{},路由键{},消息id{},消息内容{}", + returnedMessage.getReplyCode(), + returnedMessage.getReplyText(), + returnedMessage.getExchange(), + returnedMessage.getRoutingKey(), + messageId, + content); + if (failMsgDao != null) { + failMsgDao.save(NumberUtils.parseLong(messageId), returnedMessage.getExchange(), returnedMessage.getRoutingKey(), content, null, DateUtils.getCurrentTime(), "returnCallback"); + } + } + } + ); + } + +} diff --git a/framework/rabbitmq/src/main/java/com/itmingchen/rabbitmq/dao/FailMsgDao.java b/framework/rabbitmq/src/main/java/com/itmingchen/rabbitmq/dao/FailMsgDao.java new file mode 100644 index 0000000..cd32f0b --- /dev/null +++ b/framework/rabbitmq/src/main/java/com/itmingchen/rabbitmq/dao/FailMsgDao.java @@ -0,0 +1,40 @@ +package com.itmingchen.rabbitmq.dao; + + +import com.itmingchen.rabbitmq.domain.FailMsg; + +import java.util.List; + +public interface FailMsgDao { + /** + * 保存失败消息 + * + * @param failMsg 失败消息 + */ + void save(FailMsg failMsg); + + /** + * + * @param id + * @param exchange + * @param routingKey + * @param msg + * @param delay + * @param failMessage + */ + void save(Long id, String exchange, String routingKey, Object msg, Integer delay, Integer nextFetchTime, String failMessage); + + /** + * 获取当前可执行消息,并修改执行消息执行的时间,防止重复执行 + * @param limit 获取条数 + * @return + */ + List fetch(Integer limit); + + /** + * 根据id删除 + * + * @param id 失败消息id + */ + void removeById(Long id); +} diff --git a/framework/rabbitmq/src/main/java/com/itmingchen/rabbitmq/dao/impl/FailMsgDaoImpl.java b/framework/rabbitmq/src/main/java/com/itmingchen/rabbitmq/dao/impl/FailMsgDaoImpl.java new file mode 100644 index 0000000..f5d12d4 --- /dev/null +++ b/framework/rabbitmq/src/main/java/com/itmingchen/rabbitmq/dao/impl/FailMsgDaoImpl.java @@ -0,0 +1,90 @@ +package com.itmingchen.rabbitmq.dao.impl; + +import com.itmingchen.common.utils.CollUtils; +import com.itmingchen.common.utils.DateUtils; +import com.itmingchen.common.utils.JsonUtils; +import com.itmingchen.rabbitmq.dao.FailMsgDao; +import com.itmingchen.rabbitmq.dao.mapper.FailMsgMapper; +import com.itmingchen.rabbitmq.domain.FailMsg; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.stereotype.Repository; + +import java.util.List; +import java.util.stream.Collectors; + +@Repository +@ConditionalOnProperty(prefix = "rabbit-mq", name = "persistence.enable", havingValue = "true") +public class FailMsgDaoImpl implements FailMsgDao { + + private final FailMsgMapper failMsgMapper; + + public FailMsgDaoImpl(FailMsgMapper failMsgMapper) { + this.failMsgMapper = failMsgMapper; + } + + /** + * 集合名称 + */ + private static final String COLLECTION_NAME = "fail_msg"; + private static final String FAIL_CONSUMER_MSG = "fail_consumer_msg"; + + private static final String FIELD_NAME_NEXT_EXECUTE_TIME = "next_execute_time"; + private static final String FIELD_NAME_EXCHANGE = "exchange"; + private static final String FIELD_NAME_QUEUE = "queue"; + private static final String FIELD_NAME_ROUTING_KEY = "routing_key"; + private static final String FIELD_NAME_MSG = "msg"; + private static final String FIELD_NAME_REASON = "reason"; + + /** + * 保存失败消息 + * + * @param failMsg 失败消息 + */ + @Override + public void save(FailMsg failMsg) { + + List failMsgs = failMsgMapper.queryById(failMsg.getId()); + if (CollUtils.isEmpty(failMsgs)) { + failMsgMapper.insert(failMsg); + } else { + failMsgMapper.updateById(failMsg); + } + } + + + @Override + public void save(Long id, String exchange, String routingKey, Object msg, Integer delay, Integer nextFetchTime, String failMessage) { + //更新下次执行时间 + FailMsg failMsg = FailMsg.builder().id(id) + .exchange(exchange) + .routingKey(routingKey) + .msg(JsonUtils.toJsonStr(msg)) + .delayMsgExecuteTime(DateUtils.getCurrentTime() + delay) + .nextFetchTime(nextFetchTime) + .reason(failMessage) + .build(); + + failMsgMapper.insert(failMsg); + } + + + @Override + public List fetch(Integer limit) { + + List failMsgs = failMsgMapper.fetch(DateUtils.getCurrentTime(), 100); + if (CollUtils.isNotEmpty(failMsgs)) { + failMsgMapper.batchUpdateExecuteTime(10, failMsgs.stream().map(FailMsg::getId).collect(Collectors.toList())); + } + return failMsgs; + } + + /** + * 根据id删除 + * + * @param id 失败消息id + */ + @Override + public void removeById(Long id) { + failMsgMapper.deleteById(id); + } +} diff --git a/framework/rabbitmq/src/main/java/com/itmingchen/rabbitmq/dao/mapper/FailMsgMapper.java b/framework/rabbitmq/src/main/java/com/itmingchen/rabbitmq/dao/mapper/FailMsgMapper.java new file mode 100644 index 0000000..024e653 --- /dev/null +++ b/framework/rabbitmq/src/main/java/com/itmingchen/rabbitmq/dao/mapper/FailMsgMapper.java @@ -0,0 +1,45 @@ +package com.itmingchen.rabbitmq.dao.mapper; + +import com.itmingchen.rabbitmq.domain.FailMsg; +import org.apache.ibatis.annotations.*; + +import java.util.List; + +/** + *

+ * 失败消息 Mapper 接口 + *

+ * + * @author itcast + * @since 2023-07-11 + */ +public interface FailMsgMapper { + String BASE_COLUMNS = " id,exchange,routing_key as 'routingKey',msg,reason,delay_msg_execute_time as delayMsgExecuteTime,create_time as createTime, update_time as updateTime,next_fetch_time as nextFetchTime "; + + @Insert("insert into fail_msg(id,exchange,routing_key,msg,reason,delay_msg_execute_time) values(#{domain.id}," + + "#{domain.exchange},#{domain.routingKey},#{domain.msg},#{domain.reason},#{domain.delayMsgExecuteTime})") + int insert(@Param("domain") FailMsg failMsg); + + @Select("select" + BASE_COLUMNS + "from fail_msg where id=#{id} limit 1") + List queryById(@Param("id") Long id); + + @Update("update fail_msg set exchange=#{domain.exchange},routing_key=#{domain.routingKey},msg=#{domain.msg},reason=#{domain.reason},delay_msg_execute_time=#{domain.delayMsgExecuteTime}" + + " where id=#{domain.id}") + int updateById(@Param("domain") FailMsg failMsg); + + + @Update("") + void batchUpdateExecuteTime(@Param("time") Integer time, @Param("ids") List ids); + + /** + * 查询要执行的前n条数据 + * @param fetchTime 执行时间 + * @param num 获取num条数据 + * @return 执行失败记录 + */ + @Select("select" + BASE_COLUMNS + "from fail_msg where next_fetch_time<=#{fetchTime} limit #{num} ") + List fetch(@Param("fetchTime") Integer fetchTime, @Param("num") Integer num); + + @Delete("delete from fail_msg where id=#{id}") + int deleteById(@Param("id") Long id); +} diff --git a/framework/rabbitmq/src/main/java/com/itmingchen/rabbitmq/domain/ErrorRabbitMqMessage.java b/framework/rabbitmq/src/main/java/com/itmingchen/rabbitmq/domain/ErrorRabbitMqMessage.java new file mode 100644 index 0000000..6dc8a16 --- /dev/null +++ b/framework/rabbitmq/src/main/java/com/itmingchen/rabbitmq/domain/ErrorRabbitMqMessage.java @@ -0,0 +1,12 @@ +package com.itmingchen.rabbitmq.domain; + +import lombok.Data; + +import java.io.Serializable; + +@Data +public class ErrorRabbitMqMessage implements Serializable { + private String originRoutingKey; + private String originExchange; + private String message; +} diff --git a/framework/rabbitmq/src/main/java/com/itmingchen/rabbitmq/domain/FailMsg.java b/framework/rabbitmq/src/main/java/com/itmingchen/rabbitmq/domain/FailMsg.java new file mode 100644 index 0000000..ce6226c --- /dev/null +++ b/framework/rabbitmq/src/main/java/com/itmingchen/rabbitmq/domain/FailMsg.java @@ -0,0 +1,67 @@ +package com.itmingchen.rabbitmq.domain; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.time.LocalDateTime; +import java.io.Serializable; + +/** + *

+ * 失败消息 + *

+ * + * @author itcast + * @since 2023-07-11 + */ +@Data +@AllArgsConstructor +@Builder +@NoArgsConstructor +public class FailMsg implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 消息id + */ + private Long id; + + /** + * 交换机 + */ + private String exchange; + + /** + * 路由key + */ + private String routingKey; + + /** + * 消息 + */ + private String msg; + + /** + * 原因 + */ + private String reason; + + /** + * 延迟消息执行时间 + */ + private Integer delayMsgExecuteTime; + + /** + * 下次拉取时间 + */ + private Integer nextFetchTime; + + private LocalDateTime createTime; + + private LocalDateTime updateTime; + + +} diff --git a/framework/rabbitmq/src/main/java/com/itmingchen/rabbitmq/plugins/DelayMessagePostProcessor.java b/framework/rabbitmq/src/main/java/com/itmingchen/rabbitmq/plugins/DelayMessagePostProcessor.java new file mode 100644 index 0000000..2c1db6e --- /dev/null +++ b/framework/rabbitmq/src/main/java/com/itmingchen/rabbitmq/plugins/DelayMessagePostProcessor.java @@ -0,0 +1,29 @@ +package com.itmingchen.rabbitmq.plugins; + +import com.itmingchen.common.utils.NumberUtils; +import org.springframework.amqp.AmqpException; +import org.springframework.amqp.core.Message; +import org.springframework.amqp.core.MessagePostProcessor; + +/** + * 延迟消息处理器 + * + * @author itcast + */ +public class DelayMessagePostProcessor implements MessagePostProcessor { + + // 延迟队列默认延迟5s + private static final int DEFAULT_DELAY = 5; + private Integer delay; + + public DelayMessagePostProcessor(Integer delay) { + this.delay = delay; + } + + @Override + public Message postProcessMessage(Message message) throws AmqpException { + + message.getMessageProperties().setDelay(NumberUtils.null2Default(delay, DEFAULT_DELAY)); + return message; + } +} diff --git a/framework/rabbitmq/src/main/java/com/itmingchen/rabbitmq/plugins/ErrorMessageRecoverer.java b/framework/rabbitmq/src/main/java/com/itmingchen/rabbitmq/plugins/ErrorMessageRecoverer.java new file mode 100644 index 0000000..b7e6c94 --- /dev/null +++ b/framework/rabbitmq/src/main/java/com/itmingchen/rabbitmq/plugins/ErrorMessageRecoverer.java @@ -0,0 +1,34 @@ +package com.itmingchen.rabbitmq.plugins; + +import com.itmingchen.rabbitmq.client.RabbitClient; +import com.itmingchen.rabbitmq.domain.ErrorRabbitMqMessage; +import com.itmingchen.rabbitmq.properties.RabbitmqProperties; +import org.springframework.amqp.core.Message; +import org.springframework.amqp.rabbit.retry.MessageRecoverer; + + +public class ErrorMessageRecoverer implements MessageRecoverer { + + private RabbitClient rabbitClient; + private RabbitmqProperties rabbitmqProperties; + + + public ErrorMessageRecoverer(RabbitClient rabbitClient, RabbitmqProperties rabbitmqProperties) { + this.rabbitClient = rabbitClient; + this.rabbitmqProperties = rabbitmqProperties; + } + + @Override + public void recover(Message message, Throwable cause) { + + // 指定routingKey的消息才能进入队列 + if(rabbitmqProperties.getError().getWhiteList().contains(message.getMessageProperties().getReceivedRoutingKey())) { + ErrorRabbitMqMessage errorRabbitMqMessage = new ErrorRabbitMqMessage(); + errorRabbitMqMessage.setOriginRoutingKey(message.getMessageProperties().getReceivedRoutingKey()); + errorRabbitMqMessage.setOriginExchange(message.getMessageProperties().getReceivedExchange()); + errorRabbitMqMessage.setMessage(new String(message.getBody())); + rabbitClient.sendMsg(rabbitmqProperties.getError().getExchange(), rabbitmqProperties.getError().getRoutingKey(), errorRabbitMqMessage); + } + } + +} diff --git a/framework/rabbitmq/src/main/java/com/itmingchen/rabbitmq/plugins/RabbitMqListenableFutureCallback.java b/framework/rabbitmq/src/main/java/com/itmingchen/rabbitmq/plugins/RabbitMqListenableFutureCallback.java new file mode 100644 index 0000000..365eb79 --- /dev/null +++ b/framework/rabbitmq/src/main/java/com/itmingchen/rabbitmq/plugins/RabbitMqListenableFutureCallback.java @@ -0,0 +1,49 @@ +package com.itmingchen.rabbitmq.plugins; + +import cn.hutool.core.exceptions.ExceptionUtil; +import com.itmingchen.common.utils.DateUtils; +import com.itmingchen.rabbitmq.dao.FailMsgDao; +import lombok.Builder; +import org.springframework.amqp.rabbit.connection.CorrelationData; +import org.springframework.util.concurrent.ListenableFutureCallback; + +/** + * @author itcast + */ +@Builder +public class RabbitMqListenableFutureCallback implements ListenableFutureCallback { + + //记录失败消息service + private FailMsgDao failMsgDao; + + private String exchange; + private String routingKey; + private String msg; + private Long msgId; + private Integer delay; + + //是否是失败消息 + private boolean isFailMsg=false; + + @Override + public void onFailure(Throwable ex) { + if(failMsgDao == null) { + return; + } + failMsgDao.save(msgId, exchange, routingKey, msg, delay, DateUtils.getCurrentTime() + 10, ExceptionUtil.getMessage(ex)); + } + + @Override + public void onSuccess(CorrelationData.Confirm result) { + if(failMsgDao == null){ + return; + } + if(!result.isAck()){ + // 执行失败保存失败信息,如果已经存在保存信息,如果不在信息信息 + failMsgDao.save(msgId, exchange, routingKey, msg, delay,DateUtils.getCurrentTime() + 10, "MQ回复nack"); + }else if(isFailMsg && msgId != null){ + // 如果发送的是失败消息,当收到ack需要从fail_msg删除该消息 + failMsgDao.removeById(msgId); + } + } +} diff --git a/framework/rabbitmq/src/main/java/com/itmingchen/rabbitmq/plugins/RabbitMqResender.java b/framework/rabbitmq/src/main/java/com/itmingchen/rabbitmq/plugins/RabbitMqResender.java new file mode 100644 index 0000000..eeabaf6 --- /dev/null +++ b/framework/rabbitmq/src/main/java/com/itmingchen/rabbitmq/plugins/RabbitMqResender.java @@ -0,0 +1,61 @@ +package com.itmingchen.rabbitmq.plugins; + +import com.itmingchen.common.utils.IoUtils; +import com.itmingchen.common.utils.JsonUtils; +import com.itmingchen.rabbitmq.domain.ErrorRabbitMqMessage; +import com.itmingchen.rabbitmq.properties.RabbitmqProperties; +import com.rabbitmq.client.Channel; +import com.rabbitmq.client.GetResponse; +import lombok.extern.slf4j.Slf4j; +import org.springframework.amqp.core.Message; +import org.springframework.amqp.core.MessageBuilder; +import org.springframework.amqp.rabbit.core.RabbitTemplate; + +import javax.annotation.PreDestroy; +import java.io.IOException; +import java.nio.charset.Charset; + +@Slf4j +public class RabbitMqResender { + + private RabbitTemplate rabbitTemplate; + private RabbitmqProperties rabbitmqProperties; + private Channel channel; + + public RabbitMqResender(RabbitTemplate rabbitTemplate, RabbitmqProperties rabbitmqProperties) { + this.rabbitTemplate = rabbitTemplate; + this.rabbitmqProperties = rabbitmqProperties; + channel = rabbitTemplate.getConnectionFactory() + .createConnection() + .createChannel(false); + + } + + /** + * 从队列中获取一条数据并处理,如果没有消息,返回false,有消息返回true + */ + public boolean getOneMessageAndProcess() { + + try { + GetResponse response = channel.basicGet(rabbitmqProperties.getError().getQueue(), false); + if(response == null) { + return false; + } + ErrorRabbitMqMessage errorRabbitMqMessage = JsonUtils.toBean(new String(response.getBody()), ErrorRabbitMqMessage.class); + Message message = MessageBuilder.withBody(errorRabbitMqMessage.getMessage().getBytes(Charset.defaultCharset())).build(); + rabbitTemplate.send(errorRabbitMqMessage.getOriginExchange(), errorRabbitMqMessage.getOriginRoutingKey(), message); + channel.basicAck(response.getEnvelope().getDeliveryTag(), false); + return true; + }catch (IOException e) { + log.error("消息重发失败,e:",e); + return false; + } + } + + @PreDestroy + public void destory() { + log.info("rabbitmq销毁..."); + IoUtils.close(channel); + + } +} diff --git a/framework/rabbitmq/src/main/java/com/itmingchen/rabbitmq/properties/RabbitmqProperties.java b/framework/rabbitmq/src/main/java/com/itmingchen/rabbitmq/properties/RabbitmqProperties.java new file mode 100644 index 0000000..354340f --- /dev/null +++ b/framework/rabbitmq/src/main/java/com/itmingchen/rabbitmq/properties/RabbitmqProperties.java @@ -0,0 +1,43 @@ +package com.itmingchen.rabbitmq.properties; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.boot.context.properties.NestedConfigurationProperty; +import org.springframework.context.annotation.Configuration; + +import java.util.ArrayList; +import java.util.List; + +@Data +@ConfigurationProperties(prefix = "rabbit-mq.recoverer") +@Configuration +public class RabbitmqProperties { + + @NestedConfigurationProperty + private Error error = new Error(); + + @Data + public static class Error { + /** + * mq消费异常接收routingKey + */ + private String routingKey = "error.rounting-key"; + /** + * mq消费异常接收交换机 + */ + private String exchange = "error.exchange"; + + /** + * mq消费异常接收队列 + */ + private String queue = "error.queue"; + /** + * 消费异常白名单,进入白名单的routingKey才会进入异常队列重新处理 + */ + @NestedConfigurationProperty + private List whiteList = new ArrayList<>(); + } + + + +} diff --git a/framework/rabbitmq/src/main/resources/META-INF/spring-configuration-metadata.json b/framework/rabbitmq/src/main/resources/META-INF/spring-configuration-metadata.json new file mode 100644 index 0000000..799a9c6 --- /dev/null +++ b/framework/rabbitmq/src/main/resources/META-INF/spring-configuration-metadata.json @@ -0,0 +1,9 @@ +{ + "groups": [ + + ], + "properties": [ + + ], + "hints": [] +} \ No newline at end of file diff --git a/framework/rabbitmq/src/main/resources/META-INF/spring.factories b/framework/rabbitmq/src/main/resources/META-INF/spring.factories new file mode 100644 index 0000000..9608a23 --- /dev/null +++ b/framework/rabbitmq/src/main/resources/META-INF/spring.factories @@ -0,0 +1,2 @@ +org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ + com.itmingchen.rabbitmq.config.RabbitMqConfiguration \ No newline at end of file diff --git a/framework/rabbitmq/src/main/resources/mapper/RegisterMapper.xml b/framework/rabbitmq/src/main/resources/mapper/RegisterMapper.xml new file mode 100644 index 0000000..07a9255 --- /dev/null +++ b/framework/rabbitmq/src/main/resources/mapper/RegisterMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/framework/redis/.gitignore b/framework/redis/.gitignore new file mode 100644 index 0000000..5ff6309 --- /dev/null +++ b/framework/redis/.gitignore @@ -0,0 +1,38 @@ +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### IntelliJ IDEA ### +.idea/modules.xml +.idea/jarRepositories.xml +.idea/compiler.xml +.idea/libraries/ +*.iws +*.iml +*.ipr + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store \ No newline at end of file diff --git a/framework/redis/pom.xml b/framework/redis/pom.xml new file mode 100644 index 0000000..84167cb --- /dev/null +++ b/framework/redis/pom.xml @@ -0,0 +1,50 @@ + + + + parent + mingchen + 1.1-SNAPSHOT + ../parent + + 4.0.0 + + redis + + + + 11 + 11 + + + + + org.springframework.boot + spring-boot-starter-data-redis + + + org.redisson + redisson + + + + mingchen + common + 1.1-SNAPSHOT + + + org.springframework.boot + spring-boot-autoconfigure + + + com.fasterxml.jackson.datatype + jackson-datatype-jsr310 + + + org.springframework.boot + spring-boot-starter-cache + + + + \ No newline at end of file diff --git a/framework/redis/src/main/java/com/itmingchen/redis/annotations/HashCacheClear.java b/framework/redis/src/main/java/com/itmingchen/redis/annotations/HashCacheClear.java new file mode 100644 index 0000000..6a042d0 --- /dev/null +++ b/framework/redis/src/main/java/com/itmingchen/redis/annotations/HashCacheClear.java @@ -0,0 +1,71 @@ +package com.itmingchen.redis.annotations; + +import com.itmingchen.common.utils.StringUtils; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * 分页缓存中重要的字段,必须马上同步, + * 单个缓存清理优先于批量处理,如果批量清理请不要设置dataId + * @author 86188 + */ +@Retention(RetentionPolicy.RUNTIME) +@Target({ElementType.METHOD}) +public @interface HashCacheClear { + + /** + * hash表的redisKey,支持aspl表达式,例如 evaluation_#{targetId},targetId的类中的字段 + * @return + */ + String key() default StringUtils.EMPTY; + + /** + * 无法直接获取到dataType时可以通过自定义适配器换取dataType,dataTypeAdapterName数据适配器名称 + * @return + */ + String keyHandlerName() default StringUtils.EMPTY; + + /** + * 无法直接获取到dataType时可以通过自定义适配器换取dataType,dataTypeConvertParamNames是转换方法入口参数 + * + * @return + */ + String[] keyHandlerParamNames() default {}; + + + /** + * hashKey,支持aspl表达式,例如 evaluation_#{targetId},targetId的类中的字段 + * @return + */ + String fieldId() default StringUtils.EMPTY; + + /** + * 批量操作的模型类 + * + * @return + */ + int batchFieldIdsIndex() default -1; + + /** + * 总是清理,该字段为true,fields无需设置 + * + * @return + */ + boolean always() default true; + + /** + * 判断是否删除缓存的handler名称 + * + * @return + */ + String judgeRemoveCacheHandlerName() default StringUtils.EMPTY; + + /** + * 判断是否删除缓存的handler + * @return + */ + String[] judgeRemoveCacheHandlerParamNames() default StringUtils.EMPTY; +} diff --git a/framework/redis/src/main/java/com/itmingchen/redis/annotations/Lock.java b/framework/redis/src/main/java/com/itmingchen/redis/annotations/Lock.java new file mode 100644 index 0000000..cd6f5df --- /dev/null +++ b/framework/redis/src/main/java/com/itmingchen/redis/annotations/Lock.java @@ -0,0 +1,56 @@ +package com.itmingchen.redis.annotations; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; +import java.util.concurrent.TimeUnit; + + +/** + * @author Mr.M + * @version 1.0 + * @description 分布式锁工具类 + * @date 2023/7/23 22:48 + */ +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.METHOD) +public @interface Lock { + + + /** + * 加锁key的表达式,支持表达式 + */ + String formatter(); + + /** + * 加锁时长 + */ + long time() default 5; + + /** + * 阻塞超时时间,默认2分钟,当block为true的时候生效 + */ + long waitTime() default 120; + + /** + * 加锁时间单位 + */ + TimeUnit unit() default TimeUnit.SECONDS; + + /** + * 方法访问完后要不要解锁,默认自动解锁 + */ + boolean unlock() default true; + + /** + * 如果设定了true将在获取锁时阻塞等待waitTime时间 + */ + boolean block() default false; + + /** + * 是否启用自动续期,如果使用自动续期则unlock必须设置为true + */ + boolean startDog() default false; + +} diff --git a/framework/redis/src/main/java/com/itmingchen/redis/aspect/HashCacheClearAspect.java b/framework/redis/src/main/java/com/itmingchen/redis/aspect/HashCacheClearAspect.java new file mode 100644 index 0000000..de5aeae --- /dev/null +++ b/framework/redis/src/main/java/com/itmingchen/redis/aspect/HashCacheClearAspect.java @@ -0,0 +1,94 @@ +package com.itmingchen.redis.aspect; + +import cn.hutool.extra.spring.SpringUtil; +import com.itmingchen.common.utils.AspectUtils; +import com.itmingchen.common.utils.StringUtils; +import com.itmingchen.redis.annotations.HashCacheClear; +import com.itmingchen.redis.handler.HashCacheKeyHandler; +import com.itmingchen.redis.helper.CacheHelper; +import com.itmingchen.redis.helper.JudgeRemoveCacheHandler; +import lombok.extern.slf4j.Slf4j; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; + +import java.lang.reflect.Method; +import java.util.List; + +@Aspect +@Slf4j +public class HashCacheClearAspect { + + private final CacheHelper cacheHelper; + + public HashCacheClearAspect(CacheHelper cacheHelper) { + this.cacheHelper = cacheHelper; + } + + @Around("@annotation(hashCacheClear)") + public Object pageClear(ProceedingJoinPoint pjp, HashCacheClear hashCacheClear) throws Throwable { + // 1.校验是否清理缓存 + // 1.1.获取当前执行方法 + Method method = AspectUtils.getMethod(pjp); + // 1.2.获取当前执行方法参数 + Object[] args = pjp.getArgs(); + + // 1.3.校验是否清理缓存,不满足直接执行业务逻辑 + if (!hashCacheClear.always() && StringUtils.isEmpty(hashCacheClear.judgeRemoveCacheHandlerName())) { + // 1.4.执行业务逻辑 + return pjp.proceed(pjp.getArgs()); + } + // 1.5.通过JudgeRemoveCacheHandler判断是否删除缓存 + List params = AspectUtils.parseList(hashCacheClear.judgeRemoveCacheHandlerParamNames(), method, args); + JudgeRemoveCacheHandler judgeRemoveCacheHandler = getBean(hashCacheClear.judgeRemoveCacheHandlerName(), JudgeRemoveCacheHandler.class); + if(judgeRemoveCacheHandler != null && !judgeRemoveCacheHandler.judgeRemoveCache(params)) { + return pjp.proceed(pjp.getArgs()); + } + // 2.准备清理缓存数据 + String key = null; + if (StringUtils.isNotEmpty(hashCacheClear.key())) { + // 2.1.可以直接获取dataType + key = AspectUtils.parse(hashCacheClear.key(), method, args); + } else { + // 2.2.通过自定义适配器获取dataType + // 2.2.1.获取适配器 + HashCacheKeyHandler hashCacheKeyHandler = getBean(hashCacheClear.keyHandlerName(), HashCacheKeyHandler.class); + // 2.2.2.获取入参 + List dataTypeParams = AspectUtils.parseList(hashCacheClear.keyHandlerParamNames(), method, args); + // 2.2.3.获取dataType + key = hashCacheKeyHandler.key(dataTypeParams); + } + + // 3.执行业务逻辑 + Object executeResult = pjp.proceed(args); + + // 4.批量清理缓存 + if ( hashCacheClear.batchFieldIdsIndex() > -1) { + // 4.1.批量清理缓存 + // 4.1.1.获取objectIds所在的入参data + Object data = args[hashCacheClear.batchFieldIdsIndex()]; + // 4.1.2.入参为空不能清理缓存,直接返回 + if (data == null) { + return executeResult; + } + // 4.1.3.批量删除 + cacheHelper.batchRemove(key, (List) data); + + } else if (StringUtils.isNotEmpty(hashCacheClear.fieldId())) { + // 4.2.删除单个缓存 + cacheHelper.remove(key, AspectUtils.parse(hashCacheClear.fieldId(), method, args)); + } + + return executeResult; + } + + + private T getBean(String beanName, Class clazz) { + if (StringUtils.isEmpty(beanName)) { + return null; + } + return SpringUtil.getBean(beanName, clazz); + } + + +} diff --git a/framework/redis/src/main/java/com/itmingchen/redis/aspect/LockAspect.java b/framework/redis/src/main/java/com/itmingchen/redis/aspect/LockAspect.java new file mode 100644 index 0000000..c01a776 --- /dev/null +++ b/framework/redis/src/main/java/com/itmingchen/redis/aspect/LockAspect.java @@ -0,0 +1,79 @@ +package com.itmingchen.redis.aspect; + +import com.itmingchen.common.constants.other.ErrorInfo; +import com.itmingchen.common.expcetions.BadRequestException; +import com.itmingchen.common.expcetions.RequestTimeoutException; +import com.itmingchen.common.utils.AspectUtils; +import com.itmingchen.redis.annotations.Lock; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.redisson.api.RLock; +import org.redisson.api.RedissonClient; + +import java.lang.reflect.Method; + +/** + * @author Mr.M + * @version 1.0 + * @description 分布式锁工具类 + * @date 2023/7/23 22:56 + */ +@Aspect +public class LockAspect { + + private final RedissonClient redissonClient; + + public LockAspect(RedissonClient redissonClient) { + this.redissonClient = redissonClient; + } + + @Around("@annotation(lock)") + public Object handleLock(ProceedingJoinPoint pjp, Lock lock) throws Throwable { + //锁key的格式化字符,此字符串中有spEL表达式 + String formatter = lock.formatter(); + Method method = AspectUtils.getMethod(pjp); + Object[] args = pjp.getArgs(); + //得到锁的key + String redisKey = AspectUtils.parse(formatter, method, args); + //获取锁阻塞等待的时间,如果是0表示去尝试获取锁,如果获取不到则结束 + long waitTime = 0; + //阻塞等待获取锁 + if (lock.block()) { + //根据时间单位转换成ms + waitTime = lock.waitTime(); + } + //加锁时长 + long time = lock.time(); + //启动看门狗自动续期 + if(lock.startDog()){ + time = -1; + //如果设置自动续期必须在方法执行后释放锁 + if(!lock.unlock()){ + throw new BadRequestException(ErrorInfo.Msg.REQUEST_PARAM_ILLEGAL); + } + } + //得到锁对象 + RLock rLock = redissonClient.getLock(redisKey); + //尝试加锁 + boolean success = rLock.tryLock(waitTime,time, lock.unit()); + if (!success && !lock.block()) { + //未阻塞要求的情况下未得到锁 + throw new BadRequestException(ErrorInfo.Msg.REQUEST_OPERATE_FREQUENTLY); + } + if (!success) { + //阻塞情况下未得到锁,请求超时 + throw new RequestTimeoutException(ErrorInfo.Msg.REQUEST_TIME_OUT); + } + + try { + return pjp.proceed(); + } finally { + if (lock.unlock()) { + rLock.unlock(); + } + } + + } + +} diff --git a/framework/redis/src/main/java/com/itmingchen/redis/config/LockConfiguration.java b/framework/redis/src/main/java/com/itmingchen/redis/config/LockConfiguration.java new file mode 100644 index 0000000..164927f --- /dev/null +++ b/framework/redis/src/main/java/com/itmingchen/redis/config/LockConfiguration.java @@ -0,0 +1,34 @@ +package com.itmingchen.redis.config; + +import com.itmingchen.redis.aspect.LockAspect; +import lombok.extern.slf4j.Slf4j; +import org.redisson.api.RedissonClient; +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.EnableAspectJAutoProxy; + +/** + * @author itcast + */ +@Configuration +@ConditionalOnClass(RedissonClient.class) +@Slf4j +@EnableAspectJAutoProxy +public class LockConfiguration { + + /** + * 实例化分布式锁切面实例 + * + * @param redissonClient + * @return + */ + @Bean + @ConditionalOnMissingBean + public LockAspect lockAspect(RedissonClient redissonClient) { + log.debug("分布式锁切面实例化..."); + return new LockAspect(redissonClient); + } + +} diff --git a/framework/redis/src/main/java/com/itmingchen/redis/config/RedisConfiguration.java b/framework/redis/src/main/java/com/itmingchen/redis/config/RedisConfiguration.java new file mode 100644 index 0000000..6c4c1e1 --- /dev/null +++ b/framework/redis/src/main/java/com/itmingchen/redis/config/RedisConfiguration.java @@ -0,0 +1,74 @@ +package com.itmingchen.redis.config; + +import com.itmingchen.common.utils.DateUtils; +import com.itmingchen.redis.aspect.HashCacheClearAspect; +import com.itmingchen.redis.helper.CacheHelper; +import com.itmingchen.redis.helper.LockHelper; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.SerializationFeature; +import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; +import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateDeserializer; +import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer; +import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer; +import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; +import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.autoconfigure.data.redis.RedisProperties; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; +import org.springframework.context.annotation.Primary; +import org.springframework.data.redis.connection.RedisConnectionFactory; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer; +import org.springframework.data.redis.serializer.GenericToStringSerializer; +import org.springframework.data.redis.serializer.StringRedisSerializer; + +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; + +/** + * @author itcast + */ +@Configuration +@Slf4j +@EnableConfigurationProperties(RedisProperties.class) +@Import({CacheHelper.class, LockHelper.class}) +public class RedisConfiguration { + private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper(); + + static{ + JavaTimeModule timeModule = new JavaTimeModule(); + timeModule.addDeserializer(LocalDate.class, + new LocalDateDeserializer(DateTimeFormatter.ofPattern(DateUtils.DEFAULT_DATE_FORMAT))); + timeModule.addDeserializer(LocalDateTime.class, + new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern(DateUtils.DEFAULT_DATE_TIME_FORMAT))); + timeModule.addSerializer(LocalDate.class, + new LocalDateSerializer(DateTimeFormatter.ofPattern(DateUtils.DEFAULT_DATE_FORMAT))); + timeModule.addSerializer(LocalDateTime.class, + new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(DateUtils.DEFAULT_DATE_TIME_FORMAT))); + OBJECT_MAPPER.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); + OBJECT_MAPPER.registerModule(timeModule); + } + + + @Bean("redisTemplate") + @Primary + public RedisTemplate restTemplate(RedisConnectionFactory redisConnnectionFactory) { + + RedisTemplate redisTemplate = new RedisTemplate<>(); + log.info("redisTemplate hashCode : {}", redisTemplate.hashCode()); + redisTemplate.setConnectionFactory(redisConnnectionFactory); + redisTemplate.setKeySerializer(new StringRedisSerializer()); + redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer()); + redisTemplate.setHashKeySerializer(new GenericToStringSerializer(String.class)); + redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer(OBJECT_MAPPER)); + return redisTemplate; + } + + @Bean + public HashCacheClearAspect hashCacheClearAspect(CacheHelper cacheHelper) { + return new HashCacheClearAspect(cacheHelper); + } +} diff --git a/framework/redis/src/main/java/com/itmingchen/redis/config/RedisQueueSyncConfiguration.java b/framework/redis/src/main/java/com/itmingchen/redis/config/RedisQueueSyncConfiguration.java new file mode 100644 index 0000000..21c1260 --- /dev/null +++ b/framework/redis/src/main/java/com/itmingchen/redis/config/RedisQueueSyncConfiguration.java @@ -0,0 +1,13 @@ +package com.itmingchen.redis.config; + +import com.itmingchen.redis.properties.RedisSyncProperties; +import com.itmingchen.redis.sync.impl.SyncManagerImpl; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; + +@Configuration +@EnableConfigurationProperties(RedisSyncProperties.class) +@Import(SyncManagerImpl.class) +public class RedisQueueSyncConfiguration { +} diff --git a/framework/redis/src/main/java/com/itmingchen/redis/config/RedissonConfiguration.java b/framework/redis/src/main/java/com/itmingchen/redis/config/RedissonConfiguration.java new file mode 100644 index 0000000..9f830f2 --- /dev/null +++ b/framework/redis/src/main/java/com/itmingchen/redis/config/RedissonConfiguration.java @@ -0,0 +1,84 @@ +package com.itmingchen.redis.config; + +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.util.StrUtil; +import lombok.extern.slf4j.Slf4j; +import org.redisson.Redisson; +import org.redisson.api.RedissonClient; +import org.redisson.config.Config; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.boot.autoconfigure.data.redis.RedisProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import java.time.Duration; +import java.util.ArrayList; +import java.util.List; + +@Configuration +@Slf4j +public class RedissonConfiguration { + + /** + * redis单例实例连接前缀 + */ + private static final String REDIS_PROTOCOL_PREFIX = "redis://"; + /** + * redis集群实例连接前缀 + */ + private static final String REDISS_PROTOCOL_PREFIX = "rediss://"; + + @Bean + @ConditionalOnMissingBean + public RedissonClient redissonClient(RedisProperties properties) { + log.debug("尝试初始化RedissonClient"); + // 1.读取Redis配置 + RedisProperties.Cluster cluster = properties.getCluster(); + RedisProperties.Sentinel sentinel = properties.getSentinel(); + String password = properties.getPassword(); + int timeout = 3000; + Duration d = properties.getTimeout(); + if (d != null) { + timeout = Long.valueOf(d.toMillis()).intValue(); + } + // 2.设置Redisson配置 + Config config = new Config(); + if (cluster != null && !CollectionUtil.isEmpty(cluster.getNodes())) { + // 集群模式 + config.useClusterServers() + .addNodeAddress(convert(cluster.getNodes())) + .setConnectTimeout(timeout) + .setPassword(password); + } else if (sentinel != null && !StrUtil.isEmpty(sentinel.getMaster())) { + // 哨兵模式 + config.useSentinelServers() + .setMasterName(sentinel.getMaster()) + .addSentinelAddress(convert(sentinel.getNodes())) + .setConnectTimeout(timeout) + .setDatabase(0) + .setPassword(password); + } else { + // 单机模式 + config.useSingleServer() + .setAddress(String.format("redis://%s:%d", properties.getHost(), properties.getPort())) + .setConnectTimeout(timeout) + .setDatabase(0) + .setPassword(password); + } + // 3.创建Redisson客户端 + RedissonClient redissonClient = Redisson.create(config); + return redissonClient; + } + + private String[] convert(List nodesObject) { + List nodes = new ArrayList<>(nodesObject.size()); + for (String node : nodesObject) { + if (!node.startsWith(REDIS_PROTOCOL_PREFIX) && !node.startsWith(REDISS_PROTOCOL_PREFIX)) { + nodes.add(REDIS_PROTOCOL_PREFIX + node); + } else { + nodes.add(node); + } + } + return nodes.toArray(new String[0]); + } +} diff --git a/framework/redis/src/main/java/com/itmingchen/redis/config/SpringCacheConfig.java b/framework/redis/src/main/java/com/itmingchen/redis/config/SpringCacheConfig.java new file mode 100644 index 0000000..8fdd433 --- /dev/null +++ b/framework/redis/src/main/java/com/itmingchen/redis/config/SpringCacheConfig.java @@ -0,0 +1,124 @@ +package com.itmingchen.redis.config; + +import com.fasterxml.jackson.annotation.JsonAutoDetect; +import com.fasterxml.jackson.annotation.JsonTypeInfo; +import com.fasterxml.jackson.annotation.PropertyAccessor; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.jsontype.impl.LaissezFaireSubTypeValidator; +import com.fasterxml.jackson.databind.module.SimpleModule; +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; +import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateDeserializer; +import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer; +import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer; +import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; +import com.itmingchen.common.utils.DateUtils; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Primary; +import org.springframework.data.redis.cache.RedisCacheConfiguration; +import org.springframework.data.redis.cache.RedisCacheManager; +import org.springframework.data.redis.connection.RedisConnectionFactory; +import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer; +import org.springframework.data.redis.serializer.RedisSerializationContext; + +import java.math.BigInteger; +import java.time.Duration; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.Random; + +/** + * SpringCache配置 + * + * @author itcast + * @create 2023/8/15 10:04 + **/ +@Configuration +public class SpringCacheConfig { + + /** + * 缓存时间30分钟 + * + * @param connectionFactory redis连接工厂 + * @return redis缓存管理器 + */ + @Bean + public RedisCacheManager cacheManager30Minutes(RedisConnectionFactory connectionFactory) { + int randomNum = new Random().nextInt(100); + RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig() + .entryTtl(Duration.ofSeconds(30 * 60L + randomNum)) + .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(JACKSON_SERIALIZER)); + + return RedisCacheManager.builder(connectionFactory) + .cacheDefaults(config) + .transactionAware() + .build(); + } + + /** + * 缓存时间1天 + * + * @param connectionFactory redis连接工厂 + * @return redis缓存管理器 + */ + @Bean + public RedisCacheManager cacheManagerOneDay(RedisConnectionFactory connectionFactory) { + //生成随机数 + int randomNum = new Random().nextInt(6000); + RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig() + //过期时间为基础时间加随机数 + .entryTtl(Duration.ofSeconds(24 * 60 * 60L + randomNum)) + .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(JACKSON_SERIALIZER)); + + return RedisCacheManager.builder(connectionFactory) + .cacheDefaults(config) + .transactionAware() + .build(); + } + + /** + * 永久缓存 + * + * @param connectionFactory redis连接工厂 + * @return redis缓存管理器 + */ + @Bean + @Primary + public RedisCacheManager cacheManagerForever(RedisConnectionFactory connectionFactory) { + RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig() + .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(JACKSON_SERIALIZER)); + + return RedisCacheManager.builder(connectionFactory) + .cacheDefaults(config) + .transactionAware() + .build(); + } + + private static final Jackson2JsonRedisSerializer JACKSON_SERIALIZER; + + static { + //定义Jackson类型序列化对象 + JACKSON_SERIALIZER = new Jackson2JsonRedisSerializer<>(Object.class); + //解决查询缓存转换异常的问题 + ObjectMapper om = new ObjectMapper(); + + // SimpleModule对象,添加各种序列化器和反序列化器。解决LocalDateTime、Long序列化异常 + SimpleModule simpleModule = new SimpleModule() + // 添加反序列化器 + .addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern(DateUtils.DEFAULT_DATE_TIME_FORMAT))) + .addDeserializer(LocalDate.class, new LocalDateDeserializer(DateTimeFormatter.ofPattern(DateUtils.DEFAULT_DATE_FORMAT))) + // 添加序列化器 + .addSerializer(BigInteger.class, ToStringSerializer.instance) + .addSerializer(Long.class, ToStringSerializer.instance) // 实现 Long --> String 的序列化器 + .addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(DateUtils.DEFAULT_DATE_TIME_FORMAT))) + .addSerializer(LocalDate.class, new LocalDateSerializer(DateTimeFormatter.ofPattern(DateUtils.DEFAULT_DATE_FORMAT))); + om.registerModule(simpleModule); + om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); + om.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL + , JsonTypeInfo.As.WRAPPER_ARRAY); + JACKSON_SERIALIZER.setObjectMapper(om); + } +} + + diff --git a/framework/redis/src/main/java/com/itmingchen/redis/constants/RedisSyncQueueConstants.java b/framework/redis/src/main/java/com/itmingchen/redis/constants/RedisSyncQueueConstants.java new file mode 100644 index 0000000..078c2be --- /dev/null +++ b/framework/redis/src/main/java/com/itmingchen/redis/constants/RedisSyncQueueConstants.java @@ -0,0 +1,27 @@ +package com.itmingchen.redis.constants; + +public class RedisSyncQueueConstants { + /** + * hash - redis同步队列存储结构hash + */ + public static final int STORAGE_TYPE_HASH = 1; + /** + * list - redis同步队列存储结构list + */ + public static final int STORAGE_TYPE_LIST = 2; + + /** + * zset - redis同步队列存储结构zset + */ + public static final int STORAGE_TYPE_ZSET = 3; + + /** + * 单条执行模式 + */ + public static final int MODE_SINGLE = 1; + + /** + * 批量支持模式 + */ + public static final int MODE_BATCH = 2; +} diff --git a/framework/redis/src/main/java/com/itmingchen/redis/filter/RedisAutoConfigurationImportFilter.java b/framework/redis/src/main/java/com/itmingchen/redis/filter/RedisAutoConfigurationImportFilter.java new file mode 100644 index 0000000..acf1fe1 --- /dev/null +++ b/framework/redis/src/main/java/com/itmingchen/redis/filter/RedisAutoConfigurationImportFilter.java @@ -0,0 +1,23 @@ +package com.itmingchen.redis.filter; + +import org.springframework.boot.autoconfigure.AutoConfigurationImportFilter; +import org.springframework.boot.autoconfigure.AutoConfigurationMetadata; + +/** + * 强制排除自动装箱的StringRedisTemplate和RedisTemplate两个模板类,使用自定义的RedisTemplate + */ +public class RedisAutoConfigurationImportFilter implements AutoConfigurationImportFilter { + + private static final String REDIS_AUTO_CONFIGURATION_CLASS_PATH = "org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration"; + + @Override + public boolean[] match(String[] autoConfigurationClasseNames, AutoConfigurationMetadata autoConfigurationMetadata) { + boolean[] matches = new boolean[autoConfigurationClasseNames.length]; + + for (int count = 0; count < autoConfigurationClasseNames.length; count++) { + String className = autoConfigurationClasseNames[count]; + matches[count] = !REDIS_AUTO_CONFIGURATION_CLASS_PATH.equals(className); + } + return matches; + } +} diff --git a/framework/redis/src/main/java/com/itmingchen/redis/handler/HashCacheKeyHandler.java b/framework/redis/src/main/java/com/itmingchen/redis/handler/HashCacheKeyHandler.java new file mode 100644 index 0000000..8f72928 --- /dev/null +++ b/framework/redis/src/main/java/com/itmingchen/redis/handler/HashCacheKeyHandler.java @@ -0,0 +1,17 @@ +package com.itmingchen.redis.handler; + +import java.util.List; + +/** + * @author 86188 + */ +public interface HashCacheKeyHandler { + + /** + * 获取redis hash表的key表达式 + * + * @param params 适配器入参 + * @return dataType + */ + String key(List params); +} diff --git a/framework/redis/src/main/java/com/itmingchen/redis/handler/SyncProcessHandler.java b/framework/redis/src/main/java/com/itmingchen/redis/handler/SyncProcessHandler.java new file mode 100644 index 0000000..9e3bbd8 --- /dev/null +++ b/framework/redis/src/main/java/com/itmingchen/redis/handler/SyncProcessHandler.java @@ -0,0 +1,22 @@ +package com.itmingchen.redis.handler; + +import com.itmingchen.redis.model.SyncMessage; + +import java.util.List; + +public interface SyncProcessHandler { + + /** + * 批量处理同步队列中的数据 + * + * @param multiData + */ + void batchProcess(List> multiData); + + /** + * 单一处理数据 + * + * @param singleData + */ + void singleProcess(SyncMessage singleData); +} diff --git a/framework/redis/src/main/java/com/itmingchen/redis/helper/CacheHelper.java b/framework/redis/src/main/java/com/itmingchen/redis/helper/CacheHelper.java new file mode 100644 index 0000000..fa2253d --- /dev/null +++ b/framework/redis/src/main/java/com/itmingchen/redis/helper/CacheHelper.java @@ -0,0 +1,244 @@ +package com.itmingchen.redis.helper; + +import com.itmingchen.common.utils.*; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; +import java.util.function.Function; +import java.util.stream.Collectors; + +/** + * @author itcast + */ +@Component +public class CacheHelper { + private static final String CACHE_PREFIX = "CACHE_"; + + @Autowired + private RedisTemplate redisTemplate; + + /** + * 缓存实现 + * + * @param key + * @param dataExecutor + * @param clazz + * @param ttl + * @param + * @return + */ + public T get(String key, DataExecutor dataExecutor, Class clazz, Long ttl) { + String redisKey = CACHE_PREFIX + key; + Object value = redisTemplate.opsForValue().get(redisKey); + // 缓存为“”直接返回是为了防止缓存穿透, 缓存有值直接返回 + if (StringUtils.EMPTY.equals(value)) { + return null; + } + if (StringUtils.isNotEmpty(value.toString())) { + // 自动延长redis有效期 + redisTemplate.expire(redisKey, ttl, TimeUnit.SECONDS); + if (JsonUtils.isJson(value.toString())) { + return BeanUtils.toBean(value, clazz); + } else { + return (T) value; + } + } + // 默认有效期5分钟 + if (ttl == null) { + ttl = 5 * 60L; + } + // 获取数据 + T data = dataExecutor.execute(); + // 写入缓存, + if (data == null) { + redisTemplate.opsForValue().set(redisKey, StringUtils.EMPTY, ttl, TimeUnit.SECONDS); + } else { + redisTemplate.opsForValue().set(redisKey, JsonUtils.toJsonStr(data), ttl, TimeUnit.SECONDS); + } + return data; + } + + /** + * 批量获取缓存数据,按照id列表顺序返回目标数据,如果缓存不存在则查询数据库 + * + * @param dataType 目标数据类型,CACHE_加dataType 为redisKey + * @param objectIds 目标数据唯一id + * @param batchDataQueryExecutor 批量目标数据获取执行器用于当缓存数据不存在时查询数据库 + * @param clazz 目标数据类型class + * @param ttl 目标数据整体过期时间(ttl大于0才会设置有效期) + * @param 目标数据id数据类型 + * @param 目标数据类型 + * @return + */ + public List batchGet(String dataType, List objectIds, BatchDataQueryExecutor batchDataQueryExecutor, Class clazz, Long ttl) { + // 1.缓存获取数据 + // 1.1.参数校验 + if (StringUtils.isEmpty(dataType) || CollUtils.isEmpty(objectIds)) { + return null; + } + // 1.2.redis key + String redisKey = CACHE_PREFIX + dataType; + // 1.3.获取缓存 + List list = redisTemplate.opsForHash().multiGet(redisKey, objectIds); + + // 2.缓存未得数据获取 + // 2.1.获取未缓存数据的objectIds序号列表 + List noCacheObjectIdIndexs = CollUtils.getIndexsOfNullData(list); + if (CollUtils.isEmpty(noCacheObjectIdIndexs)) { + return BeanUtils.copyToList(list, clazz); + } + // 2.2.获取未缓存数据的objectId列表 + List noCacheObjectIds = CollUtils.valueofIndexs(objectIds, noCacheObjectIdIndexs); + if (batchDataQueryExecutor == null) { + return BeanUtils.copyToList(list, clazz); + } + // 3.获取未缓存数据 + Map data = batchDataQueryExecutor.execute(noCacheObjectIds, clazz); + if (CollUtils.isEmpty(data)) { + return BeanUtils.copyToList(list, clazz); + } + // 4.未加入缓存数据入缓存 + redisTemplate.opsForHash().putAll(redisKey, data); + // 5.动态设置缓存过期时间 + if(ttl > 0) { + redisTemplate.expire(redisKey, ttl, TimeUnit.SECONDS); + } + // 6.组装返回数据,保证数据根据objectIds列表顺序返回 + for (Integer noCacheObjectIdIndex : noCacheObjectIdIndexs) { + list.set(noCacheObjectIdIndex, data.get(objectIds.get(noCacheObjectIdIndex))); + } + return BeanUtils.copyToList(list, clazz); + } + + /** + * 批量获取缓存数据,按照id列表顺序返回目标数据 + * + * @param dataType 目标数据类型,例如评价数据 + * @param batchDataQueryExecutor 目标数据获取执行器 + * @param clazz 目标数据类型class + * @param ttl 目标数据整体过期时间(ttl大于0才会设置有效期) + * @param 目标数据id数据类型 + * @param 目标数据类型 + * @return 查询结果 + */ + public List getAll(String dataType, BatchDataQueryExecutor batchDataQueryExecutor, Class clazz, Long ttl) { + //1.构建redisKey + String redisKey = CACHE_PREFIX + dataType; + + //2.从缓存查询数据 + Map entries = redisTemplate.opsForHash().entries(redisKey); + Collection values = entries.values(); + + //3.缓存中已查询出数据或不存在目标数据执行器,直接返回 + if (null == batchDataQueryExecutor || ObjectUtils.isNotEmpty(values)) { + return BeanUtils.copyToList(values, clazz); + } + + //4.执行目标数据查询执行器,使用者可以在查询执行方法中写入控制,来阻止缓存穿透 + Map data = batchDataQueryExecutor.execute(null, clazz); + if (data.size() <= 0) { + return BeanUtils.copyToList(values, clazz); + } + + //5.存储数据到缓存 + redisTemplate.opsForHash().putAll(redisKey, data); + if(ttl > 0) { + redisTemplate.expire(redisKey, ttl, TimeUnit.SECONDS); + } + + //6.返回查询结果 + return BeanUtils.copyToList(values, clazz); + } + + /** + * 批量获取缓存数据,按照id列表顺序返回目标数据 + * + * @param dataType 目标数据类型,例如评价数据 + * @param data 缓存数据 + * @param keyFunction hashKey获取函数 + * @param ttl 目标数据整体过期时间(ttl大于0才会设置有效期) + * @param 目标数据id数据雷兴国 + * @param 目标数据类型 + * @return 查询结果 + */ + public void doPutAll(String dataType, List data, Function keyFunction, Long ttl) { + //1.构建redisKey + String redisKey = CACHE_PREFIX + dataType; + if (CollUtils.isEmpty(data)) { + return; + } + K apply = keyFunction.apply(data.get(0)); + Map map = data.stream().collect(Collectors.toMap(d -> keyFunction.apply(d), d -> d)); + //5.存储数据到缓存 + redisTemplate.opsForHash().putAll(redisKey, map); + if(ttl > 0) { + redisTemplate.expire(redisKey, ttl, TimeUnit.SECONDS); + } + } + + public void batchRemove(String dataType, List objectIds) { + String redisKey = CACHE_PREFIX + dataType; + redisTemplate.opsForHash().delete(redisKey, objectIds.toArray()); + } + + /** + * 批量删除缓存 + * + * @param keys 缓存key列表 + */ + public void batchRemove(List keys) { + // 1.redis key 列表 + List redisKeys = keys.stream() + .map(key -> CACHE_PREFIX + key) + .collect(Collectors.toList()); + // 2.批量删除 + redisTemplate.delete(redisKeys); + } + + /** + * 删除缓存 + * + * @param key 缓存key + */ + public void remove(String key) { + redisTemplate.delete(CACHE_PREFIX + key); + } + + /** + * 分页缓存删除 + * + * @param dataType 数据类型 + * @param objectId 对象id + */ + public void remove(String dataType, K objectId) { + String redisKey = CACHE_PREFIX + dataType; + redisTemplate.opsForHash().delete(redisKey, objectId); + } + + public interface DataExecutor { + T execute(); + } + + /** + * 数据查询执行器 + * + * @param + */ + public interface BatchDataQueryExecutor { + /** + * 查询key对应的值 + * + * @param objectIds 没有命中的对象id列表 + * @param clazz 数据转换类型 + * @return + */ + Map execute(List objectIds, Class clazz); + } + +} diff --git a/framework/redis/src/main/java/com/itmingchen/redis/helper/JudgeRemoveCacheHandler.java b/framework/redis/src/main/java/com/itmingchen/redis/helper/JudgeRemoveCacheHandler.java new file mode 100644 index 0000000..7384fed --- /dev/null +++ b/framework/redis/src/main/java/com/itmingchen/redis/helper/JudgeRemoveCacheHandler.java @@ -0,0 +1,13 @@ +package com.itmingchen.redis.helper; + +import java.util.List; + +public interface JudgeRemoveCacheHandler { + + /** + * 判断是否删除缓存 + * @param params + * @return + */ + boolean judgeRemoveCache(List params); +} diff --git a/framework/redis/src/main/java/com/itmingchen/redis/helper/LockHelper.java b/framework/redis/src/main/java/com/itmingchen/redis/helper/LockHelper.java new file mode 100644 index 0000000..0c64770 --- /dev/null +++ b/framework/redis/src/main/java/com/itmingchen/redis/helper/LockHelper.java @@ -0,0 +1,85 @@ +package com.itmingchen.redis.helper; + +import com.itmingchen.common.utils.NumberUtils; +import lombok.extern.slf4j.Slf4j; +import org.redisson.api.RLock; +import org.redisson.api.RedissonClient; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.util.concurrent.TimeUnit; + +/** + * @author itcast + */ +@Component +@Slf4j +public class LockHelper { + + private static final String LOCK_PREFIX = "LOCK:"; + @Resource + private RedissonClient redissonClient; + + public void synchronizeLock(String key, Long waitTime, final Execution execution) { + RLock lock = null; + try { + // 加锁 + lock = getRLock(key); + if (!lock.tryLock(NumberUtils.null2Zero(waitTime), -1, TimeUnit.SECONDS)) { + return; + } + // 加锁成功执行操作 + execution.execute(); + } catch (Exception e) { + log.error("同步任务执行异常e:", e); + } finally { + // 解锁 + if (lock != null) { + lock.unlock(); + } + } + } + + public interface Execution { + /** + * 加锁后操作 + */ + void execute(); + } + + /** + * 尝试加锁 + * + * @param lockName 锁名 + * @param waitTime 等待时间,单位ms + * @param leaseTime 租约时间,单位ms + * @return 返回锁 + */ + public RLock trylock(String lockName, long waitTime, long leaseTime,TimeUnit unit) { + RLock lock = redissonClient.getLock(lockName); + try { + if(lock.tryLock(waitTime, leaseTime, unit)) { + return lock; + } + }catch (InterruptedException e) { + } + return null; + } + + + /** + * 解锁 + * + * @param rLock + */ + public void unlock(RLock rLock) { + if(rLock != null && rLock.isLocked()) { + rLock.unlock(); + } + } + + private RLock getRLock(String key) { + return redissonClient.getLock(LOCK_PREFIX + key); + } + +} diff --git a/framework/redis/src/main/java/com/itmingchen/redis/model/SyncMessage.java b/framework/redis/src/main/java/com/itmingchen/redis/model/SyncMessage.java new file mode 100644 index 0000000..6e61329 --- /dev/null +++ b/framework/redis/src/main/java/com/itmingchen/redis/model/SyncMessage.java @@ -0,0 +1,16 @@ +package com.itmingchen.redis.model; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class SyncMessage { + private String key; + private Object value; + private T data; +} diff --git a/framework/redis/src/main/java/com/itmingchen/redis/properties/RedisSyncProperties.java b/framework/redis/src/main/java/com/itmingchen/redis/properties/RedisSyncProperties.java new file mode 100644 index 0000000..98484a2 --- /dev/null +++ b/framework/redis/src/main/java/com/itmingchen/redis/properties/RedisSyncProperties.java @@ -0,0 +1,20 @@ +package com.itmingchen.redis.properties; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Configuration; + +@Configuration +@ConfigurationProperties(prefix = "redis.sync") +@Data +public class RedisSyncProperties { + /** + * 每批处理数量 + */ + private int perCount = 100; + + /** + * 队列数 + */ + private int queueNum = 10; +} diff --git a/framework/redis/src/main/java/com/itmingchen/redis/serialize/ObjectGenericJackson2JsonRedisSerializer.java b/framework/redis/src/main/java/com/itmingchen/redis/serialize/ObjectGenericJackson2JsonRedisSerializer.java new file mode 100644 index 0000000..55f8599 --- /dev/null +++ b/framework/redis/src/main/java/com/itmingchen/redis/serialize/ObjectGenericJackson2JsonRedisSerializer.java @@ -0,0 +1,29 @@ +package com.itmingchen.redis.serialize; + +import com.fasterxml.jackson.databind.ObjectMapper; +import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer; +import org.springframework.data.redis.serializer.SerializationException; + +import java.util.Objects; + +public class ObjectGenericJackson2JsonRedisSerializer extends GenericJackson2JsonRedisSerializer { + public static final ObjectGenericJackson2JsonRedisSerializer DEFAULT_INSTANCE = new ObjectGenericJackson2JsonRedisSerializer(new ObjectMapper()); + + public ObjectGenericJackson2JsonRedisSerializer(ObjectMapper mapper){ + super(mapper); + } + @Override + public byte[] serialize(Object source) throws SerializationException { + if (Objects.nonNull(source)) { + if (source instanceof String || source instanceof Character) { + return source.toString().getBytes(); + } + } + return super.serialize(source); + } + @Override + public T deserialize(byte[] source, Class type) throws SerializationException { + return super.deserialize(source, type); + } + +} diff --git a/framework/redis/src/main/java/com/itmingchen/redis/sync/SyncManager.java b/framework/redis/src/main/java/com/itmingchen/redis/sync/SyncManager.java new file mode 100644 index 0000000..512e89c --- /dev/null +++ b/framework/redis/src/main/java/com/itmingchen/redis/sync/SyncManager.java @@ -0,0 +1,29 @@ +package com.itmingchen.redis.sync; + +import java.util.concurrent.Executor; + +/** + * 同步程序管理器 + */ +public interface SyncManager { + + /** + * 开始同步,使用默认线程池 + * @param queueName 同步队列名称 + * @param storageType 数据存储类型,1:redis hash数据结构,2:redis list数据结构,3:redis zSet结构 + * @param mode 单条执行 2批量执行 + */ + void start(String queueName, int storageType, int mode); + + + /** + * 开始同步,可以使用自定义线程池,如果不设置使用默认线程池 + * @param queueName 同步队列名称 + * @param storageType 数据存储类型,1:redis hash数据结构,2:redis list数据结构,3:redis zSet结构 + * @param mode 1 单条执行 2批量执行 + * @param dataSyncExecutor 数据同步线程池 + */ + void start(String queueName, int storageType, int mode, Executor dataSyncExecutor); + + +} diff --git a/framework/redis/src/main/java/com/itmingchen/redis/sync/SyncThread.java b/framework/redis/src/main/java/com/itmingchen/redis/sync/SyncThread.java new file mode 100644 index 0000000..142c630 --- /dev/null +++ b/framework/redis/src/main/java/com/itmingchen/redis/sync/SyncThread.java @@ -0,0 +1,4 @@ +package com.itmingchen.redis.sync; + +public interface SyncThread extends Runnable{ +} diff --git a/framework/redis/src/main/java/com/itmingchen/redis/sync/impl/AbstractSyncThread.java b/framework/redis/src/main/java/com/itmingchen/redis/sync/impl/AbstractSyncThread.java new file mode 100644 index 0000000..75d030f --- /dev/null +++ b/framework/redis/src/main/java/com/itmingchen/redis/sync/impl/AbstractSyncThread.java @@ -0,0 +1,86 @@ +package com.itmingchen.redis.sync.impl; + +import cn.hutool.extra.spring.SpringUtil; +import com.itmingchen.common.utils.CollUtils; +import com.itmingchen.redis.handler.SyncProcessHandler; +import com.itmingchen.redis.model.SyncMessage; +import com.itmingchen.redis.sync.SyncThread; +import com.itmingchen.redis.utils.RedisSyncQueueUtils; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; +import org.redisson.api.RLock; +import org.redisson.api.RedissonClient; + +import java.util.List; +import java.util.concurrent.TimeUnit; + +@Slf4j +@Data +public abstract class AbstractSyncThread implements SyncThread { + /** + * redisKey格式 + */ + private static final String REDIS_KEY_FORMAT = "%s:%s:{%s}"; + private static final String LOCK_PREFIX = "LOCK:"; + private final RedissonClient redissonClient; + private final String queueName; + private final int index; + + public AbstractSyncThread(RedissonClient redissonClient, String queueName, int index) { + this.redissonClient = redissonClient; + this.queueName = queueName; + this.index = index; + } + + @Override + public void run() { + // 1.使用redssion看门狗模式锁定当前序号的队列 + String lockName = LOCK_PREFIX + RedisSyncQueueUtils.getQueueRedisKey(queueName, index); + RLock lock = redissonClient.getLock(lockName); + try { + if(!lock.tryLock(0, -1, TimeUnit.SECONDS)){ + return; + } + // 2.获取数据 + List> data = null; + while (CollUtils.isNotEmpty(data = this.getData())) { + // 3.处理数据 + this.process(data); + try { + Thread.sleep(500); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + } + } catch (Exception e){ + return; + } finally { + // 4.解锁 + if (lock != null && lock.isLocked()) { + lock.unlock(); + } + } + } + + /** + * 获取数据 + * + * @return + */ + protected abstract List> getData(); + + protected abstract boolean process(List> data); + + /** + * 先获取和队列同名的处理器,如果获取不到,获取通类型的处理器 + * + * @return + */ + protected SyncProcessHandler getSyncProcessHandler() { + SyncProcessHandler syncProcessHandler = SpringUtil.getBean(queueName, SyncProcessHandler.class); + if (syncProcessHandler != null) { + return syncProcessHandler; + } + throw new RuntimeException("未找到名称(" + queueName + ")redis 队列数据处理器"); + } +} diff --git a/framework/redis/src/main/java/com/itmingchen/redis/sync/impl/HashSyncThread.java b/framework/redis/src/main/java/com/itmingchen/redis/sync/impl/HashSyncThread.java new file mode 100644 index 0000000..a6bd848 --- /dev/null +++ b/framework/redis/src/main/java/com/itmingchen/redis/sync/impl/HashSyncThread.java @@ -0,0 +1,106 @@ +package com.itmingchen.redis.sync.impl; + +import com.itmingchen.common.utils.CollUtils; +import com.itmingchen.redis.constants.RedisSyncQueueConstants; +import com.itmingchen.redis.handler.SyncProcessHandler; +import com.itmingchen.redis.model.SyncMessage; +import com.itmingchen.redis.utils.RedisSyncQueueUtils; +import lombok.extern.slf4j.Slf4j; +import org.redisson.api.RedissonClient; +import org.springframework.data.redis.core.Cursor; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.core.ScanOptions; + +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +@Slf4j +public class HashSyncThread extends AbstractSyncThread { + private final RedisTemplate redisTemplate; + /** + * 每批数量 + */ + private int perCount = 100; + + /** + * 处理模式,默认为单条处理 + */ + private int mode = 1; + + public HashSyncThread(RedissonClient redissonClient, String queueName, int index, RedisTemplate redisTemplate, int perCount, int mode) { + super(redissonClient, queueName, index); + this.redisTemplate = redisTemplate; + this.perCount = perCount; + this.mode = mode; + } + + @Override + protected List> getData() { + Cursor> cursor = null; + // 通过scan从redis hash数据中批量获取数据,获取完数据需要手动关闭游标 + ScanOptions scanOptions = ScanOptions.scanOptions() + .count(perCount) + .build(); + try { + // sscan获取数据 + cursor = redisTemplate.opsForHash().scan(RedisSyncQueueUtils.getQueueRedisKey(getQueueName(), getIndex()), scanOptions); + // 遍历数据转换成SyncMessage列表 + return cursor.stream() + .map(entry -> SyncMessage + .builder() + .key(entry.getKey().toString()) + .value(entry.getValue()) + .build()) + .collect(Collectors.toList()); + }catch (Exception e){ + log.error("同步处理异常,e:", e); + throw new RuntimeException(e); + } finally { + // 关闭游标 + if (cursor != null) { + cursor.close(); + } + } + } + + @Override + protected boolean process(List> data) { + // 校验数据是否为空,为空停止循环遍历 + if (CollUtils.isEmpty(data)) { + return false; + } + // 根据名称获取同步处理器 + SyncProcessHandler syncProcessHandler = getSyncProcessHandler(); + // 队列redisKey + String queueRedisKey = RedisSyncQueueUtils.getQueueRedisKey(getQueueName(), getIndex()); + // 单条执行模式 + if (mode == RedisSyncQueueConstants.MODE_SINGLE) { + //逐条执行 + data.stream().forEach(objectSyncMessage -> { + try { + // 执行单条数据 + syncProcessHandler.singleProcess(objectSyncMessage); + // 从hash表中删除数据 + redisTemplate.opsForHash() + .delete(queueRedisKey, objectSyncMessage.getKey()); + } catch (Exception e) { + log.error("hash结构同步消息单独处理异常,e:", e); + } + }); + } else { + // 批量执行模式 + try { + // 批量处理数据 + syncProcessHandler.batchProcess(data); + // 获取所有hashKey + List hashKeys = data.stream().map(SyncMessage::getKey).collect(Collectors.toList()); + // 根据redisKey和hashKey列表从hash表中删除数据 + redisTemplate.opsForHash().delete(queueRedisKey, hashKeys); + } catch (Exception e) { + log.error("hash结构同步消息批量处理异常,e:", e); + } + } + return true; + } +} diff --git a/framework/redis/src/main/java/com/itmingchen/redis/sync/impl/ListSyncThread.java b/framework/redis/src/main/java/com/itmingchen/redis/sync/impl/ListSyncThread.java new file mode 100644 index 0000000..7f5c634 --- /dev/null +++ b/framework/redis/src/main/java/com/itmingchen/redis/sync/impl/ListSyncThread.java @@ -0,0 +1,7 @@ +package com.itmingchen.redis.sync.impl; + +public class ListSyncThread { + + + +} diff --git a/framework/redis/src/main/java/com/itmingchen/redis/sync/impl/SyncManagerImpl.java b/framework/redis/src/main/java/com/itmingchen/redis/sync/impl/SyncManagerImpl.java new file mode 100644 index 0000000..c8a4073 --- /dev/null +++ b/framework/redis/src/main/java/com/itmingchen/redis/sync/impl/SyncManagerImpl.java @@ -0,0 +1,90 @@ +package com.itmingchen.redis.sync.impl; + +import com.itmingchen.redis.properties.RedisSyncProperties; +import com.itmingchen.redis.sync.SyncManager; +import com.itmingchen.redis.sync.SyncThread; +import lombok.extern.slf4j.Slf4j; +import org.redisson.api.RedissonClient; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.util.concurrent.Executor; +import java.util.concurrent.ThreadPoolExecutor; + +import static com.itmingchen.redis.constants.RedisSyncQueueConstants.*; + +@Slf4j +@Component +public class SyncManagerImpl implements SyncManager { + + private static final ThreadPoolTaskExecutor DEFAULT_SYNC_EXECUTOR; + + @Resource + private RedisTemplate redisTemplate; + @Resource + private RedissonClient redissonClient; + + @Resource + private RedisSyncProperties redisSyncProperties; + + static { + DEFAULT_SYNC_EXECUTOR = new ThreadPoolTaskExecutor(); + DEFAULT_SYNC_EXECUTOR.setCorePoolSize(10); + DEFAULT_SYNC_EXECUTOR.setMaxPoolSize(20); + DEFAULT_SYNC_EXECUTOR.setQueueCapacity(999); + DEFAULT_SYNC_EXECUTOR.setThreadNamePrefix("redis-queue-sync-"); + // 设置拒绝策略:当pool已经达到max size的时候,如何处理新任务 + // CALLER_RUNS:不在新线程中执行任务,而是有调用者所在的线程来执行 + DEFAULT_SYNC_EXECUTOR.setRejectedExecutionHandler(new ThreadPoolExecutor.AbortPolicy()); + + DEFAULT_SYNC_EXECUTOR.initialize(); + } + + @Override + public void start(String queueName, int storageType, int mode) { + this.start(queueName, storageType, mode, DEFAULT_SYNC_EXECUTOR); + } + + @Override + public void start(String queueName, int storageType, int mode, final Executor dataSyncExecutor) { + //根据队列的数量循环,将每个队列的数据同步任务提交到线程池 + for (int index = 0; index < redisSyncProperties.getQueueNum(); index++) { + try { + + if (dataSyncExecutor == null) {//使用默认线程池 + //使用getSyncThread方法获取任务对象 + DEFAULT_SYNC_EXECUTOR.execute(getSyncThread(queueName, index, storageType, mode)); + } else {//使用自定义线程池 + dataSyncExecutor.execute(getSyncThread(queueName, index, storageType, mode)); + } + } catch (Exception e) { + log.error("同步数据处理异常,e:", e); + } + } + } + + /** + * 获取线程对象 + * + * @param queueName 队列名称 + * @param index 队列序号 + * @param storageType 存储结构 1:redis hash数据结构,2:redis list数据结构,3:redis zSet结构 + * @param mode 1 单条处理,2 批量处理 + * @return + */ + private SyncThread getSyncThread(String queueName, int index, Integer storageType, int mode) { + switch (storageType) {//目前组件支付同步Redis Hash结构的数据 + case STORAGE_TYPE_HASH: + return new HashSyncThread(redissonClient, queueName, index, redisTemplate, redisSyncProperties.getPerCount(), mode); + case STORAGE_TYPE_LIST: + return null; + case STORAGE_TYPE_ZSET: + return null; + } + return null; + } + + +} diff --git a/framework/redis/src/main/java/com/itmingchen/redis/sync/impl/ZSetSyncThread.java b/framework/redis/src/main/java/com/itmingchen/redis/sync/impl/ZSetSyncThread.java new file mode 100644 index 0000000..b485437 --- /dev/null +++ b/framework/redis/src/main/java/com/itmingchen/redis/sync/impl/ZSetSyncThread.java @@ -0,0 +1,5 @@ +package com.itmingchen.redis.sync.impl; + +public class ZSetSyncThread { + +} diff --git a/framework/redis/src/main/java/com/itmingchen/redis/utils/RedisSyncQueueUtils.java b/framework/redis/src/main/java/com/itmingchen/redis/utils/RedisSyncQueueUtils.java new file mode 100644 index 0000000..d3aa25d --- /dev/null +++ b/framework/redis/src/main/java/com/itmingchen/redis/utils/RedisSyncQueueUtils.java @@ -0,0 +1,16 @@ +package com.itmingchen.redis.utils; + +public class RedisSyncQueueUtils { + private static final String QUEUE_REDIS_KEY_FORMAT = "QUEUE:%s:{%s}"; + + /** + * 获取redis队列redisKey + * + * @param queueName redis队列名称 + * @param index 队列序号 + * @return + */ + public static String getQueueRedisKey(String queueName, int index){ + return String.format(QUEUE_REDIS_KEY_FORMAT, queueName, index); + } +} diff --git a/framework/redis/src/main/resources/META-INF/spring-configuration-metadata.json b/framework/redis/src/main/resources/META-INF/spring-configuration-metadata.json new file mode 100644 index 0000000..799a9c6 --- /dev/null +++ b/framework/redis/src/main/resources/META-INF/spring-configuration-metadata.json @@ -0,0 +1,9 @@ +{ + "groups": [ + + ], + "properties": [ + + ], + "hints": [] +} \ No newline at end of file diff --git a/framework/redis/src/main/resources/META-INF/spring.factories b/framework/redis/src/main/resources/META-INF/spring.factories new file mode 100644 index 0000000..bff6436 --- /dev/null +++ b/framework/redis/src/main/resources/META-INF/spring.factories @@ -0,0 +1,12 @@ +org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ + org.springframework.boot.autoconfigure.data.redis.JedisConnectionConfiguration, \ + org.springframework.boot.autoconfigure.data.redis.LettuceConnectionConfiguration, \ + com.itmingchen.redis.config.RedisConfiguration, \ + com.itmingchen.redis.config.RedissonConfiguration, \ + com.itmingchen.redis.config.LockConfiguration, \ + com.itmingchen.redis.config.SpringCacheConfig, \ + com.itmingchen.redis.config.RedisQueueSyncConfiguration + +org.springframework.boot.autoconfigure.AutoConfigurationImportFilter=\ +com.itmingchen.redis.filter.RedisAutoConfigurationImportFilter + \ No newline at end of file diff --git a/framework/xxl-job/.gitignore b/framework/xxl-job/.gitignore new file mode 100644 index 0000000..5ff6309 --- /dev/null +++ b/framework/xxl-job/.gitignore @@ -0,0 +1,38 @@ +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### IntelliJ IDEA ### +.idea/modules.xml +.idea/jarRepositories.xml +.idea/compiler.xml +.idea/libraries/ +*.iws +*.iml +*.ipr + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store \ No newline at end of file diff --git a/framework/xxl-job/pom.xml b/framework/xxl-job/pom.xml new file mode 100644 index 0000000..8f7130b --- /dev/null +++ b/framework/xxl-job/pom.xml @@ -0,0 +1,38 @@ + + + + parent + mingchen + 1.1-SNAPSHOT + ../parent + + 4.0.0 + + xxl-job + + + 11 + 11 + + + + + mingchen + common + 1.1-SNAPSHOT + + + + com.xuxueli + xxl-job-core + + + org.springframework.boot + spring-boot-autoconfigure + + + + + \ No newline at end of file diff --git a/framework/xxl-job/src/main/java/com/itmingchen/xxl/job/config/XxlJobConfiguration.java b/framework/xxl-job/src/main/java/com/itmingchen/xxl/job/config/XxlJobConfiguration.java new file mode 100644 index 0000000..1fa8a62 --- /dev/null +++ b/framework/xxl-job/src/main/java/com/itmingchen/xxl/job/config/XxlJobConfiguration.java @@ -0,0 +1,41 @@ +package com.itmingchen.xxl.job.config; + +import com.itmingchen.common.utils.StringUtils; +import com.itmingchen.xxl.job.properties.XxlJobProperties; +import com.xxl.job.core.executor.impl.XxlJobSpringExecutor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Slf4j +@Configuration +@ConditionalOnProperty(prefix = "xxl-job", value = "enable", havingValue = "true") +@EnableConfigurationProperties(XxlJobProperties.class) +public class XxlJobConfiguration { + + @Bean + public XxlJobSpringExecutor xxlJobExecutor(XxlJobProperties prop) { + log.info(">>>>>>>>>>> xxl-job config init."); + XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor(); + XxlJobProperties.Admin admin = prop.getAdmin(); + if (admin != null && StringUtils.isNotEmpty(admin.getAddress())) { + xxlJobSpringExecutor.setAdminAddresses(admin.getAddress()); + } + XxlJobProperties.Executor executor = prop.getExecutor(); + xxlJobSpringExecutor.setAccessToken(prop.getAccessToken()); + if (executor != null) { + xxlJobSpringExecutor.setIp(executor.getIp()); + xxlJobSpringExecutor.setAppname(executor.getAppName()); + xxlJobSpringExecutor.setPort(executor.getPort()); + xxlJobSpringExecutor.setLogPath(executor.getLogPath()); + xxlJobSpringExecutor.setLogRetentionDays( + executor.getLogRetentionDays() + ); + } + + log.info(">>>>>>>>>>> xxl-job config end."); + return xxlJobSpringExecutor; + } +} diff --git a/framework/xxl-job/src/main/java/com/itmingchen/xxl/job/properties/XxlJobProperties.java b/framework/xxl-job/src/main/java/com/itmingchen/xxl/job/properties/XxlJobProperties.java new file mode 100644 index 0000000..1786c8e --- /dev/null +++ b/framework/xxl-job/src/main/java/com/itmingchen/xxl/job/properties/XxlJobProperties.java @@ -0,0 +1,30 @@ +package com.itmingchen.xxl.job.properties; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Configuration; + +@Data +@ConfigurationProperties(prefix = "xxl-job") +@Configuration +public class XxlJobProperties { + + private String accessToken; + private Admin admin; + private Executor executor; + + @Data + public static class Admin { + private String address; + } + + @Data + public static class Executor { + private String appName; + private String ip; + private Integer port; + private String logPath; + private Integer logRetentionDays; + + } +} \ No newline at end of file diff --git a/framework/xxl-job/src/main/resources/META-INF/spring.factories b/framework/xxl-job/src/main/resources/META-INF/spring.factories new file mode 100644 index 0000000..b606c78 --- /dev/null +++ b/framework/xxl-job/src/main/resources/META-INF/spring.factories @@ -0,0 +1,2 @@ +org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ + com.itmingchen.xxl.job.config.XxlJobConfiguration \ No newline at end of file diff --git a/log/blog-dev/spring.log-2025-04-16-0.log b/log/blog-dev/spring.log-2025-04-16-0.log new file mode 100644 index 0000000..551ebdd --- /dev/null +++ b/log/blog-dev/spring.log-2025-04-16-0.log @@ -0,0 +1,5184 @@ +2025-04-16 09:11:11.925 INFO 5577 --- [restartedMain] com.mingchen.BlogApiApplication : Starting BlogApiApplication on mingchendeMac-mini.local with PID 5577 (/Users/mingchen/code/java/other/legalAid/api/target/classes started by mingchen in /Users/mingchen/code/java/other/legalAid) +2025-04-16 09:11:11.926 DEBUG 5577 --- [restartedMain] com.mingchen.BlogApiApplication : Running with Spring Boot v2.2.7.RELEASE, Spring v5.2.6.RELEASE +2025-04-16 09:11:11.926 INFO 5577 --- [restartedMain] com.mingchen.BlogApiApplication : The following profiles are active: dev +2025-04-16 09:11:11.942 INFO 5577 --- [restartedMain] o.s.b.devtools.restart.ChangeableUrls : The Class-Path manifest attribute in /usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/jaxb-runtime-2.3.1.jar referenced one or more files that do not exist: file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/jaxb-api-2.3.1.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/txw2-2.3.1.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/istack-commons-runtime-3.0.7.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/stax-ex-1.8.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/FastInfoset-1.2.15.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/javax.activation-api-1.2.0.jar +2025-04-16 09:11:11.942 INFO 5577 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : Devtools property defaults active! Set 'spring.devtools.add-properties' to 'false' to disable +2025-04-16 09:11:11.942 INFO 5577 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : For additional web related logging consider setting the 'logging.level.web' property to 'DEBUG' +2025-04-16 09:11:11.973 WARN 5577 --- [restartedMain] ConfigServletWebServerApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanDefinitionStoreException: Failed to parse configuration class [com.mingchen.BlogApiApplication]; nested exception is org.springframework.context.annotation.ConflictingBeanDefinitionException: Annotation-specified bean name 'redisSerializeConfig' for bean class [com.mingchen.common.config.configuration.RedisSerializeConfig] conflicts with existing, non-compatible bean definition of same name and class [com.mingchen.common.config.RedisSerializeConfig] +2025-04-16 09:11:11.975 ERROR 5577 --- [restartedMain] o.s.boot.SpringApplication : Application run failed + +org.springframework.beans.factory.BeanDefinitionStoreException: Failed to parse configuration class [com.mingchen.BlogApiApplication]; nested exception is org.springframework.context.annotation.ConflictingBeanDefinitionException: Annotation-specified bean name 'redisSerializeConfig' for bean class [com.mingchen.common.config.configuration.RedisSerializeConfig] conflicts with existing, non-compatible bean definition of same name and class [com.mingchen.common.config.RedisSerializeConfig] + at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:188) + at org.springframework.context.annotation.ConfigurationClassPostProcessor.processConfigBeanDefinitions(ConfigurationClassPostProcessor.java:319) + at org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry(ConfigurationClassPostProcessor.java:236) + at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanDefinitionRegistryPostProcessors(PostProcessorRegistrationDelegate.java:280) + at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:96) + at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:706) + at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:532) + at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:141) + at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:747) + at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:397) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:315) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:1226) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:1215) + at com.mingchen.BlogApiApplication.main(BlogApiApplication.java:12) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:569) + at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:49) +Caused by: org.springframework.context.annotation.ConflictingBeanDefinitionException: Annotation-specified bean name 'redisSerializeConfig' for bean class [com.mingchen.common.config.configuration.RedisSerializeConfig] conflicts with existing, non-compatible bean definition of same name and class [com.mingchen.common.config.RedisSerializeConfig] + at org.springframework.context.annotation.ClassPathBeanDefinitionScanner.checkCandidate(ClassPathBeanDefinitionScanner.java:349) + at org.springframework.context.annotation.ClassPathBeanDefinitionScanner.doScan(ClassPathBeanDefinitionScanner.java:287) + at org.springframework.context.annotation.ComponentScanAnnotationParser.parse(ComponentScanAnnotationParser.java:132) + at org.springframework.context.annotation.ConfigurationClassParser.doProcessConfigurationClass(ConfigurationClassParser.java:295) + at org.springframework.context.annotation.ConfigurationClassParser.processConfigurationClass(ConfigurationClassParser.java:249) + at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:206) + at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:174) + ... 18 common frames omitted + +2025-04-16 09:11:22.045 INFO 5590 --- [restartedMain] com.mingchen.BlogApiApplication : Starting BlogApiApplication on mingchendeMac-mini.local with PID 5590 (/Users/mingchen/code/java/other/legalAid/api/target/classes started by mingchen in /Users/mingchen/code/java/other/legalAid) +2025-04-16 09:11:22.047 DEBUG 5590 --- [restartedMain] com.mingchen.BlogApiApplication : Running with Spring Boot v2.2.7.RELEASE, Spring v5.2.6.RELEASE +2025-04-16 09:11:22.047 INFO 5590 --- [restartedMain] com.mingchen.BlogApiApplication : The following profiles are active: dev +2025-04-16 09:11:22.067 INFO 5590 --- [restartedMain] o.s.b.devtools.restart.ChangeableUrls : The Class-Path manifest attribute in /usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/jaxb-runtime-2.3.1.jar referenced one or more files that do not exist: file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/jaxb-api-2.3.1.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/txw2-2.3.1.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/istack-commons-runtime-3.0.7.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/stax-ex-1.8.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/FastInfoset-1.2.15.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/javax.activation-api-1.2.0.jar +2025-04-16 09:11:22.067 INFO 5590 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : Devtools property defaults active! Set 'spring.devtools.add-properties' to 'false' to disable +2025-04-16 09:11:22.067 INFO 5590 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : For additional web related logging consider setting the 'logging.level.web' property to 'DEBUG' +2025-04-16 09:11:22.109 WARN 5590 --- [restartedMain] ConfigServletWebServerApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanDefinitionStoreException: Failed to parse configuration class [com.mingchen.BlogApiApplication]; nested exception is org.springframework.context.annotation.ConflictingBeanDefinitionException: Annotation-specified bean name 'redisSerializeConfig' for bean class [com.mingchen.common.config.configuration.RedisSerializeConfig] conflicts with existing, non-compatible bean definition of same name and class [com.mingchen.common.config.RedisSerializeConfig] +2025-04-16 09:11:22.112 ERROR 5590 --- [restartedMain] o.s.boot.SpringApplication : Application run failed + +org.springframework.beans.factory.BeanDefinitionStoreException: Failed to parse configuration class [com.mingchen.BlogApiApplication]; nested exception is org.springframework.context.annotation.ConflictingBeanDefinitionException: Annotation-specified bean name 'redisSerializeConfig' for bean class [com.mingchen.common.config.configuration.RedisSerializeConfig] conflicts with existing, non-compatible bean definition of same name and class [com.mingchen.common.config.RedisSerializeConfig] + at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:188) + at org.springframework.context.annotation.ConfigurationClassPostProcessor.processConfigBeanDefinitions(ConfigurationClassPostProcessor.java:319) + at org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry(ConfigurationClassPostProcessor.java:236) + at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanDefinitionRegistryPostProcessors(PostProcessorRegistrationDelegate.java:280) + at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:96) + at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:706) + at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:532) + at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:141) + at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:747) + at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:397) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:315) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:1226) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:1215) + at com.mingchen.BlogApiApplication.main(BlogApiApplication.java:12) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:569) + at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:49) +Caused by: org.springframework.context.annotation.ConflictingBeanDefinitionException: Annotation-specified bean name 'redisSerializeConfig' for bean class [com.mingchen.common.config.configuration.RedisSerializeConfig] conflicts with existing, non-compatible bean definition of same name and class [com.mingchen.common.config.RedisSerializeConfig] + at org.springframework.context.annotation.ClassPathBeanDefinitionScanner.checkCandidate(ClassPathBeanDefinitionScanner.java:349) + at org.springframework.context.annotation.ClassPathBeanDefinitionScanner.doScan(ClassPathBeanDefinitionScanner.java:287) + at org.springframework.context.annotation.ComponentScanAnnotationParser.parse(ComponentScanAnnotationParser.java:132) + at org.springframework.context.annotation.ConfigurationClassParser.doProcessConfigurationClass(ConfigurationClassParser.java:295) + at org.springframework.context.annotation.ConfigurationClassParser.processConfigurationClass(ConfigurationClassParser.java:249) + at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:206) + at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:174) + ... 18 common frames omitted + +2025-04-16 09:14:11.227 INFO 5792 --- [restartedMain] com.mingchen.BlogApiApplication : Starting BlogApiApplication on mingchendeMac-mini.local with PID 5792 (/Users/mingchen/code/java/other/legalAid/api/target/classes started by mingchen in /Users/mingchen/code/java/other/legalAid) +2025-04-16 09:14:11.230 DEBUG 5792 --- [restartedMain] com.mingchen.BlogApiApplication : Running with Spring Boot v2.2.7.RELEASE, Spring v5.2.6.RELEASE +2025-04-16 09:14:11.230 INFO 5792 --- [restartedMain] com.mingchen.BlogApiApplication : The following profiles are active: dev +2025-04-16 09:14:11.261 INFO 5792 --- [restartedMain] o.s.b.devtools.restart.ChangeableUrls : The Class-Path manifest attribute in /usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/jaxb-runtime-2.3.1.jar referenced one or more files that do not exist: file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/jaxb-api-2.3.1.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/txw2-2.3.1.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/istack-commons-runtime-3.0.7.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/stax-ex-1.8.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/FastInfoset-1.2.15.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/javax.activation-api-1.2.0.jar +2025-04-16 09:14:11.261 INFO 5792 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : Devtools property defaults active! Set 'spring.devtools.add-properties' to 'false' to disable +2025-04-16 09:14:11.261 INFO 5792 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : For additional web related logging consider setting the 'logging.level.web' property to 'DEBUG' +2025-04-16 09:14:11.517 INFO 5792 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Multiple Spring Data modules found, entering strict repository configuration mode! +2025-04-16 09:14:11.518 INFO 5792 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data Redis repositories in DEFAULT mode. +2025-04-16 09:14:11.530 INFO 5792 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 7ms. Found 0 Redis repository interfaces. +2025-04-16 09:14:11.818 INFO 5792 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 9092 (http) +2025-04-16 09:14:11.822 INFO 5792 --- [restartedMain] o.apache.catalina.core.StandardService : Starting service [Tomcat] +2025-04-16 09:14:11.823 INFO 5792 --- [restartedMain] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.34] +2025-04-16 09:14:11.851 INFO 5792 --- [restartedMain] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext +2025-04-16 09:14:11.851 INFO 5792 --- [restartedMain] o.s.web.context.ContextLoader : Root WebApplicationContext: initialization completed in 590 ms +2025-04-16 09:14:12.353 INFO 5792 --- [restartedMain] n.b.p.u.AbstractUserAgentAnalyzerDirect : - Loaded 90 files in 221 msec using expression: classpath*:UserAgents/**/*.yaml +2025-04-16 09:14:12.353 INFO 5792 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : +2025-04-16 09:14:12.353 INFO 5792 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : /-----------------------------------------------------------\ +2025-04-16 09:14:12.353 INFO 5792 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : | Yauaa 5.20 (v5.20 @ 2020-11-22T15:39:16Z) | +2025-04-16 09:14:12.353 INFO 5792 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : +-----------------------------------------------------------+ +2025-04-16 09:14:12.353 INFO 5792 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : | For more information: https://yauaa.basjes.nl | +2025-04-16 09:14:12.353 INFO 5792 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : | Copyright (C) 2013-2020 Niels Basjes - License Apache 2.0 | +2025-04-16 09:14:12.353 INFO 5792 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : \-----------------------------------------------------------/ +2025-04-16 09:14:12.353 INFO 5792 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : +2025-04-16 09:14:12.356 INFO 5792 --- [restartedMain] n.b.p.u.AbstractUserAgentAnalyzerDirect : Building all needed matchers for the requested 11 fields. +2025-04-16 09:14:12.403 INFO 5792 --- [restartedMain] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor' +2025-04-16 09:14:12.480 INFO 5792 --- [restartedMain] org.quartz.impl.StdSchedulerFactory : Using default implementation for ThreadExecutor +2025-04-16 09:14:12.483 INFO 5792 --- [restartedMain] org.quartz.core.SchedulerSignalerImpl : Initialized Scheduler Signaller of type: class org.quartz.core.SchedulerSignalerImpl +2025-04-16 09:14:12.484 INFO 5792 --- [restartedMain] org.quartz.core.QuartzScheduler : Quartz Scheduler v.2.3.2 created. +2025-04-16 09:14:12.484 INFO 5792 --- [restartedMain] org.quartz.simpl.RAMJobStore : RAMJobStore initialized. +2025-04-16 09:14:12.484 INFO 5792 --- [restartedMain] org.quartz.core.QuartzScheduler : Scheduler meta-data: Quartz Scheduler (v2.3.2) 'quartzScheduler' with instanceId 'NON_CLUSTERED' + Scheduler class: 'org.quartz.core.QuartzScheduler' - running locally. + NOT STARTED. + Currently in standby mode. + Number of jobs executed: 0 + Using thread pool 'org.quartz.simpl.SimpleThreadPool' - with 10 threads. + Using job-store 'org.quartz.simpl.RAMJobStore' - which does not support persistence. and is not clustered. + +2025-04-16 09:14:12.484 INFO 5792 --- [restartedMain] org.quartz.impl.StdSchedulerFactory : Quartz scheduler 'quartzScheduler' initialized from an externally provided properties instance. +2025-04-16 09:14:12.484 INFO 5792 --- [restartedMain] org.quartz.impl.StdSchedulerFactory : Quartz scheduler version: 2.3.2 +2025-04-16 09:14:12.484 INFO 5792 --- [restartedMain] org.quartz.core.QuartzScheduler : JobFactory set to: org.springframework.scheduling.quartz.SpringBeanJobFactory@6c927103 +2025-04-16 09:14:12.515 INFO 5792 --- [restartedMain] o.s.s.web.DefaultSecurityFilterChain : Creating filter chain: any request, [org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter@58e0c24c, org.springframework.security.web.context.SecurityContextPersistenceFilter@437a691a, org.springframework.security.web.header.HeaderWriterFilter@2ae7c49d, org.springframework.web.filter.CorsFilter@3b5921e6, org.springframework.security.web.authentication.logout.LogoutFilter@617d33ff, com.mingchen.common.config.JwtLoginFilter@30180487, com.mingchen.common.config.JwtFilter@f315e9c, org.springframework.security.web.savedrequest.RequestCacheAwareFilter@63a00e77, org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter@76ef0ff2, org.springframework.security.web.authentication.AnonymousAuthenticationFilter@511d1f94, org.springframework.security.web.session.SessionManagementFilter@2f4ee8d4, org.springframework.security.web.access.ExceptionTranslationFilter@50c3fc26, org.springframework.security.web.access.intercept.FilterSecurityInterceptor@320d841a] +2025-04-16 09:14:12.528 INFO 5792 --- [restartedMain] o.s.b.d.a.OptionalLiveReloadServer : LiveReload server is running on port 35729 +2025-04-16 09:14:12.538 INFO 5792 --- [restartedMain] o.s.s.quartz.SchedulerFactoryBean : Starting Quartz Scheduler now +2025-04-16 09:14:12.539 INFO 5792 --- [restartedMain] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED started. +2025-04-16 09:14:12.549 INFO 5792 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 9092 (http) with context path '' +2025-04-16 09:14:12.552 INFO 5792 --- [restartedMain] com.mingchen.BlogApiApplication : Started BlogApiApplication in 1.582 seconds (JVM running for 1.924) +2025-04-16 09:15:04.894 INFO 5792 --- [http-nio-9092-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet' +2025-04-16 09:15:04.894 INFO 5792 --- [http-nio-9092-exec-1] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet' +2025-04-16 09:15:04.898 INFO 5792 --- [http-nio-9092-exec-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 4 ms +2025-04-16 09:15:04.915 DEBUG 5792 --- [http-nio-9092-exec-2] c.mingchen.common.config.JwtLoginFilter : Request is to process authentication +2025-04-16 09:15:04.972 INFO 5792 --- [http-nio-9092-exec-2] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting... +2025-04-16 09:15:05.474 INFO 5792 --- [http-nio-9092-exec-2] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed. +2025-04-16 09:15:05.487 DEBUG 5792 --- [http-nio-9092-exec-2] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-16 09:15:05.510 DEBUG 5792 --- [http-nio-9092-exec-2] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-16 09:15:05.567 DEBUG 5792 --- [http-nio-9092-exec-2] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-16 11:00:34.360 DEBUG 5792 --- [http-nio-9092-exec-2] c.mingchen.common.config.JwtLoginFilter : Request is to process authentication +2025-04-16 11:00:34.415 DEBUG 5792 --- [http-nio-9092-exec-2] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-16 11:00:34.416 DEBUG 5792 --- [http-nio-9092-exec-2] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-16 11:00:34.458 DEBUG 5792 --- [http-nio-9092-exec-2] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-16 11:19:10.116 INFO 5792 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED paused. +2025-04-16 11:19:10.117 INFO 5792 --- [SpringContextShutdownHook] o.s.s.quartz.SchedulerFactoryBean : Shutting down Quartz Scheduler +2025-04-16 11:19:10.117 INFO 5792 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED shutting down. +2025-04-16 11:19:10.117 INFO 5792 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED paused. +2025-04-16 11:19:10.118 INFO 5792 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED shutdown complete. +2025-04-16 11:19:10.118 INFO 5792 --- [SpringContextShutdownHook] o.s.s.concurrent.ThreadPoolTaskExecutor : Shutting down ExecutorService 'applicationTaskExecutor' +2025-04-16 11:19:10.124 INFO 5792 --- [SpringContextShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown initiated... +2025-04-16 11:19:10.125 INFO 5792 --- [SpringContextShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown completed. +2025-04-16 11:19:13.206 INFO 11671 --- [restartedMain] com.mingchen.BlogApiApplication : Starting BlogApiApplication on mingchendeMac-mini.local with PID 11671 (/Users/mingchen/code/java/other/legalAid/api/target/classes started by mingchen in /Users/mingchen/code/java/other/legalAid) +2025-04-16 11:19:13.207 DEBUG 11671 --- [restartedMain] com.mingchen.BlogApiApplication : Running with Spring Boot v2.2.7.RELEASE, Spring v5.2.6.RELEASE +2025-04-16 11:19:13.208 INFO 11671 --- [restartedMain] com.mingchen.BlogApiApplication : The following profiles are active: dev +2025-04-16 11:19:13.222 INFO 11671 --- [restartedMain] o.s.b.devtools.restart.ChangeableUrls : The Class-Path manifest attribute in /usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/jaxb-runtime-2.3.1.jar referenced one or more files that do not exist: file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/jaxb-api-2.3.1.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/txw2-2.3.1.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/istack-commons-runtime-3.0.7.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/stax-ex-1.8.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/FastInfoset-1.2.15.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/javax.activation-api-1.2.0.jar +2025-04-16 11:19:13.222 INFO 11671 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : Devtools property defaults active! Set 'spring.devtools.add-properties' to 'false' to disable +2025-04-16 11:19:13.222 INFO 11671 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : For additional web related logging consider setting the 'logging.level.web' property to 'DEBUG' +2025-04-16 11:19:13.422 INFO 11671 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Multiple Spring Data modules found, entering strict repository configuration mode! +2025-04-16 11:19:13.423 INFO 11671 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data Redis repositories in DEFAULT mode. +2025-04-16 11:19:13.435 INFO 11671 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 7ms. Found 0 Redis repository interfaces. +2025-04-16 11:19:13.685 INFO 11671 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 9092 (http) +2025-04-16 11:19:13.688 INFO 11671 --- [restartedMain] o.apache.catalina.core.StandardService : Starting service [Tomcat] +2025-04-16 11:19:13.688 INFO 11671 --- [restartedMain] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.34] +2025-04-16 11:19:13.710 INFO 11671 --- [restartedMain] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext +2025-04-16 11:19:13.710 INFO 11671 --- [restartedMain] o.s.web.context.ContextLoader : Root WebApplicationContext: initialization completed in 488 ms +2025-04-16 11:19:14.192 INFO 11671 --- [restartedMain] n.b.p.u.AbstractUserAgentAnalyzerDirect : - Loaded 90 files in 226 msec using expression: classpath*:UserAgents/**/*.yaml +2025-04-16 11:19:14.192 INFO 11671 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : +2025-04-16 11:19:14.192 INFO 11671 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : /-----------------------------------------------------------\ +2025-04-16 11:19:14.192 INFO 11671 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : | Yauaa 5.20 (v5.20 @ 2020-11-22T15:39:16Z) | +2025-04-16 11:19:14.192 INFO 11671 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : +-----------------------------------------------------------+ +2025-04-16 11:19:14.192 INFO 11671 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : | For more information: https://yauaa.basjes.nl | +2025-04-16 11:19:14.192 INFO 11671 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : | Copyright (C) 2013-2020 Niels Basjes - License Apache 2.0 | +2025-04-16 11:19:14.192 INFO 11671 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : \-----------------------------------------------------------/ +2025-04-16 11:19:14.193 INFO 11671 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : +2025-04-16 11:19:14.197 INFO 11671 --- [restartedMain] n.b.p.u.AbstractUserAgentAnalyzerDirect : Building all needed matchers for the requested 11 fields. +2025-04-16 11:19:14.251 INFO 11671 --- [restartedMain] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor' +2025-04-16 11:19:14.337 INFO 11671 --- [restartedMain] org.quartz.impl.StdSchedulerFactory : Using default implementation for ThreadExecutor +2025-04-16 11:19:14.342 INFO 11671 --- [restartedMain] org.quartz.core.SchedulerSignalerImpl : Initialized Scheduler Signaller of type: class org.quartz.core.SchedulerSignalerImpl +2025-04-16 11:19:14.342 INFO 11671 --- [restartedMain] org.quartz.core.QuartzScheduler : Quartz Scheduler v.2.3.2 created. +2025-04-16 11:19:14.342 INFO 11671 --- [restartedMain] org.quartz.simpl.RAMJobStore : RAMJobStore initialized. +2025-04-16 11:19:14.342 INFO 11671 --- [restartedMain] org.quartz.core.QuartzScheduler : Scheduler meta-data: Quartz Scheduler (v2.3.2) 'quartzScheduler' with instanceId 'NON_CLUSTERED' + Scheduler class: 'org.quartz.core.QuartzScheduler' - running locally. + NOT STARTED. + Currently in standby mode. + Number of jobs executed: 0 + Using thread pool 'org.quartz.simpl.SimpleThreadPool' - with 10 threads. + Using job-store 'org.quartz.simpl.RAMJobStore' - which does not support persistence. and is not clustered. + +2025-04-16 11:19:14.342 INFO 11671 --- [restartedMain] org.quartz.impl.StdSchedulerFactory : Quartz scheduler 'quartzScheduler' initialized from an externally provided properties instance. +2025-04-16 11:19:14.342 INFO 11671 --- [restartedMain] org.quartz.impl.StdSchedulerFactory : Quartz scheduler version: 2.3.2 +2025-04-16 11:19:14.342 INFO 11671 --- [restartedMain] org.quartz.core.QuartzScheduler : JobFactory set to: org.springframework.scheduling.quartz.SpringBeanJobFactory@3c5ea245 +2025-04-16 11:19:14.376 INFO 11671 --- [restartedMain] o.s.s.web.DefaultSecurityFilterChain : Creating filter chain: any request, [org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter@4b846f5f, org.springframework.security.web.context.SecurityContextPersistenceFilter@3f4d92cd, org.springframework.security.web.header.HeaderWriterFilter@1ff75a8f, org.springframework.web.filter.CorsFilter@b582f73, org.springframework.security.web.authentication.logout.LogoutFilter@2747c140, com.mingchen.common.config.JwtLoginFilter@376684b0, com.mingchen.common.config.JwtFilter@4c8883d, org.springframework.security.web.savedrequest.RequestCacheAwareFilter@7d0d8c6, org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter@56dbf083, org.springframework.security.web.authentication.AnonymousAuthenticationFilter@6cdef16c, org.springframework.security.web.session.SessionManagementFilter@74dbb75f, org.springframework.security.web.access.ExceptionTranslationFilter@78ce4ea, org.springframework.security.web.access.intercept.FilterSecurityInterceptor@31e0991d] +2025-04-16 11:19:14.389 INFO 11671 --- [restartedMain] o.s.b.d.a.OptionalLiveReloadServer : LiveReload server is running on port 35729 +2025-04-16 11:19:14.398 INFO 11671 --- [restartedMain] o.s.s.quartz.SchedulerFactoryBean : Starting Quartz Scheduler now +2025-04-16 11:19:14.398 INFO 11671 --- [restartedMain] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED started. +2025-04-16 11:19:14.415 INFO 11671 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 9092 (http) with context path '' +2025-04-16 11:19:14.417 INFO 11671 --- [restartedMain] com.mingchen.BlogApiApplication : Started BlogApiApplication in 1.352 seconds (JVM running for 1.608) +2025-04-16 11:19:25.902 INFO 11671 --- [http-nio-9092-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet' +2025-04-16 11:19:25.903 INFO 11671 --- [http-nio-9092-exec-1] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet' +2025-04-16 11:19:25.906 INFO 11671 --- [http-nio-9092-exec-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 3 ms +2025-04-16 11:19:25.954 ERROR 11671 --- [http-nio-9092-exec-2] c.m.c.h.ControllerExceptionHandler : Request URL : http://localhost:9092/admin/ai, Exception : + +org.springframework.web.bind.MissingServletRequestParameterException: Required String parameter 'content' is not present + at org.springframework.web.method.annotation.RequestParamMethodArgumentResolver.handleMissingValue(RequestParamMethodArgumentResolver.java:204) + at org.springframework.web.method.annotation.AbstractNamedValueMethodArgumentResolver.resolveArgument(AbstractNamedValueMethodArgumentResolver.java:114) + at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:121) + at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:167) + at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:134) + at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:105) + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:879) + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:793) + at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) + at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1040) + at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943) + at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) + at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909) + at javax.servlet.http.HttpServlet.service(HttpServlet.java:523) + at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) + at javax.servlet.http.HttpServlet.service(HttpServlet.java:590) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:320) + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:126) + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:90) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:118) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:137) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:111) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:158) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at com.mingchen.common.config.JwtFilter.doFilter(JwtFilter.java:68) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:200) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:116) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:92) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:92) + at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:77) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:105) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:56) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:215) + at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:178) + at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:358) + at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:271) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202) + at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) + at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541) + at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139) + at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) + at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) + at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) + at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:373) + at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) + at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868) + at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1590) + at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) + at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) + at java.base/java.lang.Thread.run(Thread.java:840) + +2025-04-16 11:19:25.967 WARN 11671 --- [http-nio-9092-exec-2] .m.m.a.ExceptionHandlerExceptionResolver : Resolved [org.springframework.web.bind.MissingServletRequestParameterException: Required String parameter 'content' is not present] +2025-04-16 11:19:53.321 ERROR 11671 --- [http-nio-9092-exec-3] c.m.c.h.ControllerExceptionHandler : Request URL : http://localhost:9092/admin/ai, Exception : + +org.springframework.web.bind.MissingServletRequestParameterException: Required String parameter 'content' is not present + at org.springframework.web.method.annotation.RequestParamMethodArgumentResolver.handleMissingValue(RequestParamMethodArgumentResolver.java:204) + at org.springframework.web.method.annotation.AbstractNamedValueMethodArgumentResolver.resolveArgument(AbstractNamedValueMethodArgumentResolver.java:114) + at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:121) + at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:167) + at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:134) + at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:105) + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:879) + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:793) + at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) + at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1040) + at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943) + at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) + at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909) + at javax.servlet.http.HttpServlet.service(HttpServlet.java:523) + at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) + at javax.servlet.http.HttpServlet.service(HttpServlet.java:590) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:320) + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:126) + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:90) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:118) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:137) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:111) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:158) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at com.mingchen.common.config.JwtFilter.doFilter(JwtFilter.java:68) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:200) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:116) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:92) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:92) + at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:77) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:105) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:56) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:215) + at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:178) + at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:358) + at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:271) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202) + at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) + at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541) + at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139) + at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) + at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) + at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) + at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:373) + at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) + at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868) + at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1590) + at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) + at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) + at java.base/java.lang.Thread.run(Thread.java:840) + +2025-04-16 11:19:53.324 WARN 11671 --- [http-nio-9092-exec-3] .m.m.a.ExceptionHandlerExceptionResolver : Resolved [org.springframework.web.bind.MissingServletRequestParameterException: Required String parameter 'content' is not present] +2025-04-16 11:20:36.301 INFO 11671 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED paused. +2025-04-16 11:20:36.302 INFO 11671 --- [SpringContextShutdownHook] o.s.s.quartz.SchedulerFactoryBean : Shutting down Quartz Scheduler +2025-04-16 11:20:36.302 INFO 11671 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED shutting down. +2025-04-16 11:20:36.302 INFO 11671 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED paused. +2025-04-16 11:20:36.302 INFO 11671 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED shutdown complete. +2025-04-16 11:20:36.303 INFO 11671 --- [SpringContextShutdownHook] o.s.s.concurrent.ThreadPoolTaskExecutor : Shutting down ExecutorService 'applicationTaskExecutor' +2025-04-16 11:20:38.722 INFO 11696 --- [restartedMain] com.mingchen.BlogApiApplication : Starting BlogApiApplication on mingchendeMac-mini.local with PID 11696 (/Users/mingchen/code/java/other/legalAid/api/target/classes started by mingchen in /Users/mingchen/code/java/other/legalAid) +2025-04-16 11:20:38.723 DEBUG 11696 --- [restartedMain] com.mingchen.BlogApiApplication : Running with Spring Boot v2.2.7.RELEASE, Spring v5.2.6.RELEASE +2025-04-16 11:20:38.724 INFO 11696 --- [restartedMain] com.mingchen.BlogApiApplication : The following profiles are active: dev +2025-04-16 11:20:38.740 INFO 11696 --- [restartedMain] o.s.b.devtools.restart.ChangeableUrls : The Class-Path manifest attribute in /usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/jaxb-runtime-2.3.1.jar referenced one or more files that do not exist: file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/jaxb-api-2.3.1.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/txw2-2.3.1.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/istack-commons-runtime-3.0.7.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/stax-ex-1.8.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/FastInfoset-1.2.15.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/javax.activation-api-1.2.0.jar +2025-04-16 11:20:38.741 INFO 11696 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : Devtools property defaults active! Set 'spring.devtools.add-properties' to 'false' to disable +2025-04-16 11:20:38.741 INFO 11696 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : For additional web related logging consider setting the 'logging.level.web' property to 'DEBUG' +2025-04-16 11:20:38.949 INFO 11696 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Multiple Spring Data modules found, entering strict repository configuration mode! +2025-04-16 11:20:38.950 INFO 11696 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data Redis repositories in DEFAULT mode. +2025-04-16 11:20:38.962 INFO 11696 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 7ms. Found 0 Redis repository interfaces. +2025-04-16 11:20:39.210 INFO 11696 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 9092 (http) +2025-04-16 11:20:39.213 INFO 11696 --- [restartedMain] o.apache.catalina.core.StandardService : Starting service [Tomcat] +2025-04-16 11:20:39.213 INFO 11696 --- [restartedMain] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.34] +2025-04-16 11:20:39.235 INFO 11696 --- [restartedMain] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext +2025-04-16 11:20:39.235 INFO 11696 --- [restartedMain] o.s.web.context.ContextLoader : Root WebApplicationContext: initialization completed in 494 ms +2025-04-16 11:20:39.695 INFO 11696 --- [restartedMain] n.b.p.u.AbstractUserAgentAnalyzerDirect : - Loaded 90 files in 203 msec using expression: classpath*:UserAgents/**/*.yaml +2025-04-16 11:20:39.695 INFO 11696 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : +2025-04-16 11:20:39.696 INFO 11696 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : /-----------------------------------------------------------\ +2025-04-16 11:20:39.696 INFO 11696 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : | Yauaa 5.20 (v5.20 @ 2020-11-22T15:39:16Z) | +2025-04-16 11:20:39.696 INFO 11696 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : +-----------------------------------------------------------+ +2025-04-16 11:20:39.696 INFO 11696 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : | For more information: https://yauaa.basjes.nl | +2025-04-16 11:20:39.696 INFO 11696 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : | Copyright (C) 2013-2020 Niels Basjes - License Apache 2.0 | +2025-04-16 11:20:39.696 INFO 11696 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : \-----------------------------------------------------------/ +2025-04-16 11:20:39.696 INFO 11696 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : +2025-04-16 11:20:39.700 INFO 11696 --- [restartedMain] n.b.p.u.AbstractUserAgentAnalyzerDirect : Building all needed matchers for the requested 11 fields. +2025-04-16 11:20:39.749 INFO 11696 --- [restartedMain] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor' +2025-04-16 11:20:39.831 INFO 11696 --- [restartedMain] org.quartz.impl.StdSchedulerFactory : Using default implementation for ThreadExecutor +2025-04-16 11:20:39.835 INFO 11696 --- [restartedMain] org.quartz.core.SchedulerSignalerImpl : Initialized Scheduler Signaller of type: class org.quartz.core.SchedulerSignalerImpl +2025-04-16 11:20:39.835 INFO 11696 --- [restartedMain] org.quartz.core.QuartzScheduler : Quartz Scheduler v.2.3.2 created. +2025-04-16 11:20:39.835 INFO 11696 --- [restartedMain] org.quartz.simpl.RAMJobStore : RAMJobStore initialized. +2025-04-16 11:20:39.835 INFO 11696 --- [restartedMain] org.quartz.core.QuartzScheduler : Scheduler meta-data: Quartz Scheduler (v2.3.2) 'quartzScheduler' with instanceId 'NON_CLUSTERED' + Scheduler class: 'org.quartz.core.QuartzScheduler' - running locally. + NOT STARTED. + Currently in standby mode. + Number of jobs executed: 0 + Using thread pool 'org.quartz.simpl.SimpleThreadPool' - with 10 threads. + Using job-store 'org.quartz.simpl.RAMJobStore' - which does not support persistence. and is not clustered. + +2025-04-16 11:20:39.835 INFO 11696 --- [restartedMain] org.quartz.impl.StdSchedulerFactory : Quartz scheduler 'quartzScheduler' initialized from an externally provided properties instance. +2025-04-16 11:20:39.835 INFO 11696 --- [restartedMain] org.quartz.impl.StdSchedulerFactory : Quartz scheduler version: 2.3.2 +2025-04-16 11:20:39.835 INFO 11696 --- [restartedMain] org.quartz.core.QuartzScheduler : JobFactory set to: org.springframework.scheduling.quartz.SpringBeanJobFactory@5e28e960 +2025-04-16 11:20:39.866 INFO 11696 --- [restartedMain] o.s.s.web.DefaultSecurityFilterChain : Creating filter chain: any request, [org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter@596aec7f, org.springframework.security.web.context.SecurityContextPersistenceFilter@7441019b, org.springframework.security.web.header.HeaderWriterFilter@3466b0e8, org.springframework.web.filter.CorsFilter@38a2b559, org.springframework.security.web.authentication.logout.LogoutFilter@7eca6e25, com.mingchen.common.config.JwtLoginFilter@45f6a838, com.mingchen.common.config.JwtFilter@3315416a, org.springframework.security.web.savedrequest.RequestCacheAwareFilter@5e3fdede, org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter@24354cef, org.springframework.security.web.authentication.AnonymousAuthenticationFilter@3d925a63, org.springframework.security.web.session.SessionManagementFilter@2316c7ba, org.springframework.security.web.access.ExceptionTranslationFilter@4bcda35e, org.springframework.security.web.access.intercept.FilterSecurityInterceptor@720de92f] +2025-04-16 11:20:39.878 INFO 11696 --- [restartedMain] o.s.b.d.a.OptionalLiveReloadServer : LiveReload server is running on port 35729 +2025-04-16 11:20:39.886 INFO 11696 --- [restartedMain] o.s.s.quartz.SchedulerFactoryBean : Starting Quartz Scheduler now +2025-04-16 11:20:39.886 INFO 11696 --- [restartedMain] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED started. +2025-04-16 11:20:39.896 INFO 11696 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 9092 (http) with context path '' +2025-04-16 11:20:39.899 INFO 11696 --- [restartedMain] com.mingchen.BlogApiApplication : Started BlogApiApplication in 1.337 seconds (JVM running for 1.591) +2025-04-16 11:20:53.210 INFO 11696 --- [http-nio-9092-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet' +2025-04-16 11:20:53.210 INFO 11696 --- [http-nio-9092-exec-1] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet' +2025-04-16 11:20:53.214 INFO 11696 --- [http-nio-9092-exec-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 4 ms +2025-04-16 11:20:53.259 ERROR 11696 --- [http-nio-9092-exec-1] c.m.c.h.ControllerExceptionHandler : Request URL : http://localhost:9092/admin/ai, Exception : + +org.springframework.web.bind.MissingPathVariableException: Missing URI template variable 'content' for method parameter of type String + at org.springframework.web.servlet.mvc.method.annotation.PathVariableMethodArgumentResolver.handleMissingValue(PathVariableMethodArgumentResolver.java:101) + at org.springframework.web.method.annotation.AbstractNamedValueMethodArgumentResolver.handleMissingValue(AbstractNamedValueMethodArgumentResolver.java:221) + at org.springframework.web.method.annotation.AbstractNamedValueMethodArgumentResolver.resolveArgument(AbstractNamedValueMethodArgumentResolver.java:114) + at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:121) + at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:167) + at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:134) + at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:105) + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:879) + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:793) + at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) + at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1040) + at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943) + at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) + at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909) + at javax.servlet.http.HttpServlet.service(HttpServlet.java:523) + at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) + at javax.servlet.http.HttpServlet.service(HttpServlet.java:590) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:320) + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:126) + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:90) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:118) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:137) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:111) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:158) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at com.mingchen.common.config.JwtFilter.doFilter(JwtFilter.java:68) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:200) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:116) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:92) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:92) + at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:77) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:105) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:56) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:215) + at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:178) + at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:358) + at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:271) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202) + at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) + at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541) + at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139) + at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) + at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) + at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) + at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:373) + at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) + at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868) + at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1590) + at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) + at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) + at java.base/java.lang.Thread.run(Thread.java:840) + +2025-04-16 11:20:53.272 WARN 11696 --- [http-nio-9092-exec-1] .m.m.a.ExceptionHandlerExceptionResolver : Resolved [org.springframework.web.bind.MissingPathVariableException: Missing URI template variable 'content' for method parameter of type String] +2025-04-16 11:21:59.969 ERROR 11696 --- [http-nio-9092-exec-4] c.m.c.h.ControllerExceptionHandler : Request URL : http://localhost:9092/admin/ai, Exception : + +org.springframework.web.bind.MissingPathVariableException: Missing URI template variable 'content' for method parameter of type String + at org.springframework.web.servlet.mvc.method.annotation.PathVariableMethodArgumentResolver.handleMissingValue(PathVariableMethodArgumentResolver.java:101) + at org.springframework.web.method.annotation.AbstractNamedValueMethodArgumentResolver.handleMissingValue(AbstractNamedValueMethodArgumentResolver.java:221) + at org.springframework.web.method.annotation.AbstractNamedValueMethodArgumentResolver.resolveArgument(AbstractNamedValueMethodArgumentResolver.java:114) + at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:121) + at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:167) + at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:134) + at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:105) + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:879) + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:793) + at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) + at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1040) + at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943) + at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) + at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909) + at javax.servlet.http.HttpServlet.service(HttpServlet.java:523) + at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) + at javax.servlet.http.HttpServlet.service(HttpServlet.java:590) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:320) + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:126) + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:90) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:118) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:137) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:111) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:158) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at com.mingchen.common.config.JwtFilter.doFilter(JwtFilter.java:68) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:200) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:116) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:92) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:92) + at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:77) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:105) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:56) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:215) + at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:178) + at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:358) + at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:271) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202) + at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) + at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541) + at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139) + at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) + at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) + at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) + at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:373) + at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) + at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868) + at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1590) + at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) + at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) + at java.base/java.lang.Thread.run(Thread.java:840) + +2025-04-16 11:21:59.972 WARN 11696 --- [http-nio-9092-exec-4] .m.m.a.ExceptionHandlerExceptionResolver : Resolved [org.springframework.web.bind.MissingPathVariableException: Missing URI template variable 'content' for method parameter of type String] +2025-04-16 11:22:05.527 ERROR 11696 --- [http-nio-9092-exec-6] c.m.c.h.ControllerExceptionHandler : Request URL : http://localhost:9092/admin/ai, Exception : + +org.springframework.web.bind.MissingPathVariableException: Missing URI template variable 'content' for method parameter of type String + at org.springframework.web.servlet.mvc.method.annotation.PathVariableMethodArgumentResolver.handleMissingValue(PathVariableMethodArgumentResolver.java:101) + at org.springframework.web.method.annotation.AbstractNamedValueMethodArgumentResolver.handleMissingValue(AbstractNamedValueMethodArgumentResolver.java:221) + at org.springframework.web.method.annotation.AbstractNamedValueMethodArgumentResolver.resolveArgument(AbstractNamedValueMethodArgumentResolver.java:114) + at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:121) + at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:167) + at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:134) + at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:105) + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:879) + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:793) + at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) + at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1040) + at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943) + at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) + at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909) + at javax.servlet.http.HttpServlet.service(HttpServlet.java:523) + at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) + at javax.servlet.http.HttpServlet.service(HttpServlet.java:590) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:320) + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:126) + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:90) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:118) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:137) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:111) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:158) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at com.mingchen.common.config.JwtFilter.doFilter(JwtFilter.java:68) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:200) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:116) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:92) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:92) + at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:77) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:105) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:56) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:215) + at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:178) + at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:358) + at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:271) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202) + at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) + at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541) + at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139) + at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) + at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) + at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) + at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:373) + at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) + at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868) + at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1590) + at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) + at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) + at java.base/java.lang.Thread.run(Thread.java:840) + +2025-04-16 11:22:05.530 WARN 11696 --- [http-nio-9092-exec-6] .m.m.a.ExceptionHandlerExceptionResolver : Resolved [org.springframework.web.bind.MissingPathVariableException: Missing URI template variable 'content' for method parameter of type String] +2025-04-16 11:22:16.651 INFO 11696 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED paused. +2025-04-16 11:22:16.652 INFO 11696 --- [SpringContextShutdownHook] o.s.s.quartz.SchedulerFactoryBean : Shutting down Quartz Scheduler +2025-04-16 11:22:16.652 INFO 11696 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED shutting down. +2025-04-16 11:22:16.652 INFO 11696 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED paused. +2025-04-16 11:22:16.652 INFO 11696 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED shutdown complete. +2025-04-16 11:22:16.653 INFO 11696 --- [SpringContextShutdownHook] o.s.s.concurrent.ThreadPoolTaskExecutor : Shutting down ExecutorService 'applicationTaskExecutor' +2025-04-16 11:22:18.972 INFO 11723 --- [restartedMain] com.mingchen.BlogApiApplication : Starting BlogApiApplication on mingchendeMac-mini.local with PID 11723 (/Users/mingchen/code/java/other/legalAid/api/target/classes started by mingchen in /Users/mingchen/code/java/other/legalAid) +2025-04-16 11:22:18.973 DEBUG 11723 --- [restartedMain] com.mingchen.BlogApiApplication : Running with Spring Boot v2.2.7.RELEASE, Spring v5.2.6.RELEASE +2025-04-16 11:22:18.973 INFO 11723 --- [restartedMain] com.mingchen.BlogApiApplication : The following profiles are active: dev +2025-04-16 11:22:18.994 INFO 11723 --- [restartedMain] o.s.b.devtools.restart.ChangeableUrls : The Class-Path manifest attribute in /usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/jaxb-runtime-2.3.1.jar referenced one or more files that do not exist: file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/jaxb-api-2.3.1.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/txw2-2.3.1.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/istack-commons-runtime-3.0.7.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/stax-ex-1.8.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/FastInfoset-1.2.15.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/javax.activation-api-1.2.0.jar +2025-04-16 11:22:18.995 INFO 11723 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : Devtools property defaults active! Set 'spring.devtools.add-properties' to 'false' to disable +2025-04-16 11:22:18.995 INFO 11723 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : For additional web related logging consider setting the 'logging.level.web' property to 'DEBUG' +2025-04-16 11:22:19.234 INFO 11723 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Multiple Spring Data modules found, entering strict repository configuration mode! +2025-04-16 11:22:19.235 INFO 11723 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data Redis repositories in DEFAULT mode. +2025-04-16 11:22:19.248 INFO 11723 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 7ms. Found 0 Redis repository interfaces. +2025-04-16 11:22:19.532 INFO 11723 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 9092 (http) +2025-04-16 11:22:19.535 INFO 11723 --- [restartedMain] o.apache.catalina.core.StandardService : Starting service [Tomcat] +2025-04-16 11:22:19.535 INFO 11723 --- [restartedMain] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.34] +2025-04-16 11:22:19.561 INFO 11723 --- [restartedMain] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext +2025-04-16 11:22:19.561 INFO 11723 --- [restartedMain] o.s.web.context.ContextLoader : Root WebApplicationContext: initialization completed in 566 ms +2025-04-16 11:22:20.064 INFO 11723 --- [restartedMain] n.b.p.u.AbstractUserAgentAnalyzerDirect : - Loaded 90 files in 211 msec using expression: classpath*:UserAgents/**/*.yaml +2025-04-16 11:22:20.064 INFO 11723 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : +2025-04-16 11:22:20.064 INFO 11723 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : /-----------------------------------------------------------\ +2025-04-16 11:22:20.064 INFO 11723 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : | Yauaa 5.20 (v5.20 @ 2020-11-22T15:39:16Z) | +2025-04-16 11:22:20.064 INFO 11723 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : +-----------------------------------------------------------+ +2025-04-16 11:22:20.064 INFO 11723 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : | For more information: https://yauaa.basjes.nl | +2025-04-16 11:22:20.064 INFO 11723 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : | Copyright (C) 2013-2020 Niels Basjes - License Apache 2.0 | +2025-04-16 11:22:20.064 INFO 11723 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : \-----------------------------------------------------------/ +2025-04-16 11:22:20.064 INFO 11723 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : +2025-04-16 11:22:20.069 INFO 11723 --- [restartedMain] n.b.p.u.AbstractUserAgentAnalyzerDirect : Building all needed matchers for the requested 11 fields. +2025-04-16 11:22:20.120 INFO 11723 --- [restartedMain] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor' +2025-04-16 11:22:20.202 INFO 11723 --- [restartedMain] org.quartz.impl.StdSchedulerFactory : Using default implementation for ThreadExecutor +2025-04-16 11:22:20.206 INFO 11723 --- [restartedMain] org.quartz.core.SchedulerSignalerImpl : Initialized Scheduler Signaller of type: class org.quartz.core.SchedulerSignalerImpl +2025-04-16 11:22:20.206 INFO 11723 --- [restartedMain] org.quartz.core.QuartzScheduler : Quartz Scheduler v.2.3.2 created. +2025-04-16 11:22:20.206 INFO 11723 --- [restartedMain] org.quartz.simpl.RAMJobStore : RAMJobStore initialized. +2025-04-16 11:22:20.206 INFO 11723 --- [restartedMain] org.quartz.core.QuartzScheduler : Scheduler meta-data: Quartz Scheduler (v2.3.2) 'quartzScheduler' with instanceId 'NON_CLUSTERED' + Scheduler class: 'org.quartz.core.QuartzScheduler' - running locally. + NOT STARTED. + Currently in standby mode. + Number of jobs executed: 0 + Using thread pool 'org.quartz.simpl.SimpleThreadPool' - with 10 threads. + Using job-store 'org.quartz.simpl.RAMJobStore' - which does not support persistence. and is not clustered. + +2025-04-16 11:22:20.206 INFO 11723 --- [restartedMain] org.quartz.impl.StdSchedulerFactory : Quartz scheduler 'quartzScheduler' initialized from an externally provided properties instance. +2025-04-16 11:22:20.206 INFO 11723 --- [restartedMain] org.quartz.impl.StdSchedulerFactory : Quartz scheduler version: 2.3.2 +2025-04-16 11:22:20.206 INFO 11723 --- [restartedMain] org.quartz.core.QuartzScheduler : JobFactory set to: org.springframework.scheduling.quartz.SpringBeanJobFactory@1662b878 +2025-04-16 11:22:20.240 INFO 11723 --- [restartedMain] o.s.s.web.DefaultSecurityFilterChain : Creating filter chain: any request, [org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter@70e91d45, org.springframework.security.web.context.SecurityContextPersistenceFilter@3e9c1a28, org.springframework.security.web.header.HeaderWriterFilter@6d343875, org.springframework.web.filter.CorsFilter@f5f61b0, org.springframework.security.web.authentication.logout.LogoutFilter@38afdadc, com.mingchen.common.config.JwtLoginFilter@582ec8dc, com.mingchen.common.config.JwtFilter@3358fe65, org.springframework.security.web.savedrequest.RequestCacheAwareFilter@5fa0df8a, org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter@68ec3c99, org.springframework.security.web.authentication.AnonymousAuthenticationFilter@b63ce7e, org.springframework.security.web.session.SessionManagementFilter@88881f5, org.springframework.security.web.access.ExceptionTranslationFilter@47f54d2b, org.springframework.security.web.access.intercept.FilterSecurityInterceptor@1072c29b] +2025-04-16 11:22:20.252 INFO 11723 --- [restartedMain] o.s.b.d.a.OptionalLiveReloadServer : LiveReload server is running on port 35729 +2025-04-16 11:22:20.259 INFO 11723 --- [restartedMain] o.s.s.quartz.SchedulerFactoryBean : Starting Quartz Scheduler now +2025-04-16 11:22:20.259 INFO 11723 --- [restartedMain] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED started. +2025-04-16 11:22:20.275 INFO 11723 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 9092 (http) with context path '' +2025-04-16 11:22:20.277 INFO 11723 --- [restartedMain] com.mingchen.BlogApiApplication : Started BlogApiApplication in 1.492 seconds (JVM running for 1.799) +2025-04-16 11:22:34.860 INFO 11723 --- [http-nio-9092-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet' +2025-04-16 11:22:34.860 INFO 11723 --- [http-nio-9092-exec-1] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet' +2025-04-16 11:22:34.863 INFO 11723 --- [http-nio-9092-exec-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 3 ms +2025-04-16 11:22:37.219 ERROR 11723 --- [http-nio-9092-exec-2] org.thymeleaf.TemplateEngine : [THYMELEAF][http-nio-9092-exec-2] Exception processing template "admin/ai": Error resolving template [admin/ai], template might not exist or might not be accessible by any of the configured Template Resolvers + +org.thymeleaf.exceptions.TemplateInputException: Error resolving template [admin/ai], template might not exist or might not be accessible by any of the configured Template Resolvers + at org.thymeleaf.engine.TemplateManager.resolveTemplate(TemplateManager.java:869) + at org.thymeleaf.engine.TemplateManager.parseAndProcess(TemplateManager.java:607) + at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1098) + at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1072) + at org.thymeleaf.spring5.view.ThymeleafView.renderFragment(ThymeleafView.java:362) + at org.thymeleaf.spring5.view.ThymeleafView.render(ThymeleafView.java:189) + at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1373) + at org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1118) + at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1057) + at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943) + at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) + at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909) + at javax.servlet.http.HttpServlet.service(HttpServlet.java:523) + at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) + at javax.servlet.http.HttpServlet.service(HttpServlet.java:590) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:320) + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:126) + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:90) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:118) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:137) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:111) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:158) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at com.mingchen.common.config.JwtFilter.doFilter(JwtFilter.java:68) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:200) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:116) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:92) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:92) + at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:77) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:105) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:56) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:215) + at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:178) + at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:358) + at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:271) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202) + at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) + at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541) + at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139) + at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) + at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) + at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) + at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:373) + at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) + at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868) + at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1590) + at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) + at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) + at java.base/java.lang.Thread.run(Thread.java:840) + +2025-04-16 11:22:37.220 ERROR 11723 --- [http-nio-9092-exec-2] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.thymeleaf.exceptions.TemplateInputException: Error resolving template [admin/ai], template might not exist or might not be accessible by any of the configured Template Resolvers] with root cause + +org.thymeleaf.exceptions.TemplateInputException: Error resolving template [admin/ai], template might not exist or might not be accessible by any of the configured Template Resolvers + at org.thymeleaf.engine.TemplateManager.resolveTemplate(TemplateManager.java:869) + at org.thymeleaf.engine.TemplateManager.parseAndProcess(TemplateManager.java:607) + at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1098) + at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1072) + at org.thymeleaf.spring5.view.ThymeleafView.renderFragment(ThymeleafView.java:362) + at org.thymeleaf.spring5.view.ThymeleafView.render(ThymeleafView.java:189) + at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1373) + at org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1118) + at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1057) + at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943) + at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) + at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909) + at javax.servlet.http.HttpServlet.service(HttpServlet.java:523) + at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) + at javax.servlet.http.HttpServlet.service(HttpServlet.java:590) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:320) + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:126) + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:90) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:118) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:137) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:111) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:158) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at com.mingchen.common.config.JwtFilter.doFilter(JwtFilter.java:68) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:200) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:116) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:92) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:92) + at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:77) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:105) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:56) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:215) + at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:178) + at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:358) + at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:271) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202) + at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) + at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541) + at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139) + at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) + at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) + at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) + at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:373) + at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) + at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868) + at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1590) + at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) + at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) + at java.base/java.lang.Thread.run(Thread.java:840) + +2025-04-16 11:24:42.741 ERROR 11723 --- [http-nio-9092-exec-3] org.thymeleaf.TemplateEngine : [THYMELEAF][http-nio-9092-exec-3] Exception processing template "admin/ai": Error resolving template [admin/ai], template might not exist or might not be accessible by any of the configured Template Resolvers + +org.thymeleaf.exceptions.TemplateInputException: Error resolving template [admin/ai], template might not exist or might not be accessible by any of the configured Template Resolvers + at org.thymeleaf.engine.TemplateManager.resolveTemplate(TemplateManager.java:869) + at org.thymeleaf.engine.TemplateManager.parseAndProcess(TemplateManager.java:607) + at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1098) + at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1072) + at org.thymeleaf.spring5.view.ThymeleafView.renderFragment(ThymeleafView.java:362) + at org.thymeleaf.spring5.view.ThymeleafView.render(ThymeleafView.java:189) + at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1373) + at org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1118) + at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1057) + at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943) + at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) + at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909) + at javax.servlet.http.HttpServlet.service(HttpServlet.java:523) + at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) + at javax.servlet.http.HttpServlet.service(HttpServlet.java:590) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:320) + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:126) + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:90) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:118) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:137) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:111) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:158) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at com.mingchen.common.config.JwtFilter.doFilter(JwtFilter.java:68) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:200) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:116) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:92) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:92) + at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:77) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:105) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:56) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:215) + at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:178) + at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:358) + at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:271) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202) + at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) + at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541) + at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139) + at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) + at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) + at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) + at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:373) + at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) + at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868) + at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1590) + at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) + at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) + at java.base/java.lang.Thread.run(Thread.java:840) + +2025-04-16 11:24:42.742 ERROR 11723 --- [http-nio-9092-exec-3] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.thymeleaf.exceptions.TemplateInputException: Error resolving template [admin/ai], template might not exist or might not be accessible by any of the configured Template Resolvers] with root cause + +org.thymeleaf.exceptions.TemplateInputException: Error resolving template [admin/ai], template might not exist or might not be accessible by any of the configured Template Resolvers + at org.thymeleaf.engine.TemplateManager.resolveTemplate(TemplateManager.java:869) + at org.thymeleaf.engine.TemplateManager.parseAndProcess(TemplateManager.java:607) + at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1098) + at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1072) + at org.thymeleaf.spring5.view.ThymeleafView.renderFragment(ThymeleafView.java:362) + at org.thymeleaf.spring5.view.ThymeleafView.render(ThymeleafView.java:189) + at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1373) + at org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1118) + at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1057) + at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943) + at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) + at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909) + at javax.servlet.http.HttpServlet.service(HttpServlet.java:523) + at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) + at javax.servlet.http.HttpServlet.service(HttpServlet.java:590) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:320) + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:126) + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:90) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:118) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:137) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:111) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:158) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at com.mingchen.common.config.JwtFilter.doFilter(JwtFilter.java:68) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:200) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:116) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:92) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:92) + at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:77) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:105) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:56) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:215) + at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:178) + at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:358) + at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:271) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202) + at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) + at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541) + at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139) + at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) + at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) + at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) + at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:373) + at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) + at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868) + at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1590) + at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) + at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) + at java.base/java.lang.Thread.run(Thread.java:840) + +2025-04-16 11:24:42.745 ERROR 11723 --- [http-nio-9092-exec-3] c.m.c.h.ControllerExceptionHandler : Request URL : http://localhost:9092/error, Exception : + +org.apache.catalina.connector.ClientAbortException: java.io.IOException: Broken pipe + at org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:351) + at org.apache.catalina.connector.OutputBuffer.flushByteBuffer(OutputBuffer.java:776) + at org.apache.catalina.connector.OutputBuffer.append(OutputBuffer.java:681) + at org.apache.catalina.connector.OutputBuffer.writeBytes(OutputBuffer.java:386) + at org.apache.catalina.connector.OutputBuffer.write(OutputBuffer.java:364) + at org.apache.catalina.connector.CoyoteOutputStream.write(CoyoteOutputStream.java:96) + at com.fasterxml.jackson.core.json.UTF8JsonGenerator._flushBuffer(UTF8JsonGenerator.java:2137) + at com.fasterxml.jackson.core.json.UTF8JsonGenerator.flush(UTF8JsonGenerator.java:1150) + at com.fasterxml.jackson.databind.ObjectWriter.writeValue(ObjectWriter.java:923) + at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.writeInternal(AbstractJackson2HttpMessageConverter.java:287) + at org.springframework.http.converter.AbstractGenericHttpMessageConverter.write(AbstractGenericHttpMessageConverter.java:104) + at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor.writeWithMessageConverters(AbstractMessageConverterMethodProcessor.java:287) + at org.springframework.web.servlet.mvc.method.annotation.HttpEntityMethodProcessor.handleReturnValue(HttpEntityMethodProcessor.java:219) + at org.springframework.web.method.support.HandlerMethodReturnValueHandlerComposite.handleReturnValue(HandlerMethodReturnValueHandlerComposite.java:82) + at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:123) + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:879) + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:793) + at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) + at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1040) + at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943) + at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) + at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909) + at javax.servlet.http.HttpServlet.service(HttpServlet.java:523) + at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) + at javax.servlet.http.HttpServlet.service(HttpServlet.java:590) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:320) + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:115) + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:90) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:118) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:84) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:111) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:158) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at com.mingchen.common.config.JwtFilter.doFilter(JwtFilter.java:68) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:200) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:116) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:103) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:103) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:105) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:103) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:215) + at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:178) + at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:358) + at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:271) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:712) + at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:461) + at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:384) + at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:312) + at org.apache.catalina.core.StandardHostValve.custom(StandardHostValve.java:394) + at org.apache.catalina.core.StandardHostValve.status(StandardHostValve.java:253) + at org.apache.catalina.core.StandardHostValve.throwable(StandardHostValve.java:348) + at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:173) + at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) + at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) + at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) + at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:373) + at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) + at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868) + at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1590) + at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) + at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) + at java.base/java.lang.Thread.run(Thread.java:840) +Caused by: java.io.IOException: Broken pipe + at java.base/sun.nio.ch.FileDispatcherImpl.write0(Native Method) + at java.base/sun.nio.ch.SocketDispatcher.write(SocketDispatcher.java:62) + at java.base/sun.nio.ch.IOUtil.writeFromNativeBuffer(IOUtil.java:132) + at java.base/sun.nio.ch.IOUtil.write(IOUtil.java:97) + at java.base/sun.nio.ch.IOUtil.write(IOUtil.java:53) + at java.base/sun.nio.ch.SocketChannelImpl.write(SocketChannelImpl.java:532) + at org.apache.tomcat.util.net.NioChannel.write(NioChannel.java:138) + at org.apache.tomcat.util.net.NioBlockingSelector.write(NioBlockingSelector.java:101) + at org.apache.tomcat.util.net.NioSelectorPool.write(NioSelectorPool.java:152) + at org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper.doWrite(NioEndpoint.java:1253) + at org.apache.tomcat.util.net.SocketWrapperBase.doWrite(SocketWrapperBase.java:740) + at org.apache.tomcat.util.net.SocketWrapperBase.writeBlocking(SocketWrapperBase.java:560) + at org.apache.tomcat.util.net.SocketWrapperBase.write(SocketWrapperBase.java:504) + at org.apache.coyote.http11.Http11OutputBuffer$SocketOutputBuffer.doWrite(Http11OutputBuffer.java:538) + at org.apache.coyote.http11.filters.ChunkedOutputFilter.doWrite(ChunkedOutputFilter.java:112) + at org.apache.coyote.http11.Http11OutputBuffer.doWrite(Http11OutputBuffer.java:190) + at org.apache.coyote.Response.doWrite(Response.java:601) + at org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:339) + ... 80 common frames omitted + +2025-04-16 11:24:42.750 WARN 11723 --- [http-nio-9092-exec-3] .m.m.a.ExceptionHandlerExceptionResolver : Failure in @ExceptionHandler com.mingchen.common.handler.ControllerExceptionHandler#exceptionHandler(HttpServletRequest, Exception) + +org.apache.catalina.connector.ClientAbortException: java.io.IOException: Broken pipe + at org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:351) + at org.apache.catalina.connector.OutputBuffer.flushByteBuffer(OutputBuffer.java:776) + at org.apache.catalina.connector.OutputBuffer.append(OutputBuffer.java:681) + at org.apache.catalina.connector.OutputBuffer.writeBytes(OutputBuffer.java:386) + at org.apache.catalina.connector.OutputBuffer.write(OutputBuffer.java:364) + at org.apache.catalina.connector.CoyoteOutputStream.write(CoyoteOutputStream.java:96) + at com.fasterxml.jackson.core.json.UTF8JsonGenerator._flushBuffer(UTF8JsonGenerator.java:2137) + at com.fasterxml.jackson.core.json.UTF8JsonGenerator.flush(UTF8JsonGenerator.java:1150) + at com.fasterxml.jackson.databind.ObjectWriter.writeValue(ObjectWriter.java:923) + at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.writeInternal(AbstractJackson2HttpMessageConverter.java:287) + at org.springframework.http.converter.AbstractGenericHttpMessageConverter.write(AbstractGenericHttpMessageConverter.java:104) + at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor.writeWithMessageConverters(AbstractMessageConverterMethodProcessor.java:287) + at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.handleReturnValue(RequestResponseBodyMethodProcessor.java:181) + at org.springframework.web.method.support.HandlerMethodReturnValueHandlerComposite.handleReturnValue(HandlerMethodReturnValueHandlerComposite.java:82) + at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:123) + at org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver.doResolveHandlerMethodException(ExceptionHandlerExceptionResolver.java:403) + at org.springframework.web.servlet.handler.AbstractHandlerMethodExceptionResolver.doResolveException(AbstractHandlerMethodExceptionResolver.java:61) + at org.springframework.web.servlet.handler.AbstractHandlerExceptionResolver.resolveException(AbstractHandlerExceptionResolver.java:141) + at org.springframework.web.servlet.handler.HandlerExceptionResolverComposite.resolveException(HandlerExceptionResolverComposite.java:80) + at org.springframework.web.servlet.DispatcherServlet.processHandlerException(DispatcherServlet.java:1300) + at org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1111) + at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1057) + at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943) + at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) + at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909) + at javax.servlet.http.HttpServlet.service(HttpServlet.java:523) + at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) + at javax.servlet.http.HttpServlet.service(HttpServlet.java:590) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:320) + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:115) + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:90) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:118) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:84) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:111) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:158) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at com.mingchen.common.config.JwtFilter.doFilter(JwtFilter.java:68) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:200) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:116) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:103) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:103) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:105) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:103) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:215) + at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:178) + at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:358) + at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:271) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:712) + at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:461) + at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:384) + at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:312) + at org.apache.catalina.core.StandardHostValve.custom(StandardHostValve.java:394) + at org.apache.catalina.core.StandardHostValve.status(StandardHostValve.java:253) + at org.apache.catalina.core.StandardHostValve.throwable(StandardHostValve.java:348) + at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:173) + at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) + at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) + at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) + at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:373) + at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) + at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868) + at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1590) + at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) + at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) + at java.base/java.lang.Thread.run(Thread.java:840) +Caused by: java.io.IOException: Broken pipe + at java.base/sun.nio.ch.FileDispatcherImpl.write0(Native Method) + at java.base/sun.nio.ch.SocketDispatcher.write(SocketDispatcher.java:62) + at java.base/sun.nio.ch.IOUtil.writeFromNativeBuffer(IOUtil.java:132) + at java.base/sun.nio.ch.IOUtil.write(IOUtil.java:97) + at java.base/sun.nio.ch.IOUtil.write(IOUtil.java:53) + at java.base/sun.nio.ch.SocketChannelImpl.write(SocketChannelImpl.java:532) + at org.apache.tomcat.util.net.NioChannel.write(NioChannel.java:138) + at org.apache.tomcat.util.net.NioBlockingSelector.write(NioBlockingSelector.java:101) + at org.apache.tomcat.util.net.NioSelectorPool.write(NioSelectorPool.java:152) + at org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper.doWrite(NioEndpoint.java:1253) + at org.apache.tomcat.util.net.SocketWrapperBase.doWrite(SocketWrapperBase.java:740) + at org.apache.tomcat.util.net.SocketWrapperBase.writeBlocking(SocketWrapperBase.java:560) + at org.apache.tomcat.util.net.SocketWrapperBase.write(SocketWrapperBase.java:504) + at org.apache.coyote.http11.Http11OutputBuffer$SocketOutputBuffer.doWrite(Http11OutputBuffer.java:538) + at org.apache.coyote.http11.filters.ChunkedOutputFilter.doWrite(ChunkedOutputFilter.java:110) + at org.apache.coyote.http11.Http11OutputBuffer.doWrite(Http11OutputBuffer.java:190) + at org.apache.coyote.Response.doWrite(Response.java:601) + at org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:339) + ... 83 common frames omitted + +2025-04-16 11:24:42.751 ERROR 11723 --- [http-nio-9092-exec-3] o.a.c.c.C.[Tomcat].[localhost] : Exception Processing ErrorPage[errorCode=0, location=/error] + +org.apache.catalina.connector.ClientAbortException: java.io.IOException: Broken pipe + at org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:351) + at org.apache.catalina.connector.OutputBuffer.flushByteBuffer(OutputBuffer.java:776) + at org.apache.catalina.connector.OutputBuffer.append(OutputBuffer.java:681) + at org.apache.catalina.connector.OutputBuffer.writeBytes(OutputBuffer.java:386) + at org.apache.catalina.connector.OutputBuffer.write(OutputBuffer.java:364) + at org.apache.catalina.connector.CoyoteOutputStream.write(CoyoteOutputStream.java:96) + at com.fasterxml.jackson.core.json.UTF8JsonGenerator._flushBuffer(UTF8JsonGenerator.java:2137) + at com.fasterxml.jackson.core.json.UTF8JsonGenerator.flush(UTF8JsonGenerator.java:1150) + at com.fasterxml.jackson.databind.ObjectWriter.writeValue(ObjectWriter.java:923) + at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.writeInternal(AbstractJackson2HttpMessageConverter.java:287) + at org.springframework.http.converter.AbstractGenericHttpMessageConverter.write(AbstractGenericHttpMessageConverter.java:104) + at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor.writeWithMessageConverters(AbstractMessageConverterMethodProcessor.java:287) + at org.springframework.web.servlet.mvc.method.annotation.HttpEntityMethodProcessor.handleReturnValue(HttpEntityMethodProcessor.java:219) + at org.springframework.web.method.support.HandlerMethodReturnValueHandlerComposite.handleReturnValue(HandlerMethodReturnValueHandlerComposite.java:82) + at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:123) + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:879) + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:793) + at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) + at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1040) + at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943) + at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) + at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909) + at javax.servlet.http.HttpServlet.service(HttpServlet.java:523) + at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) + at javax.servlet.http.HttpServlet.service(HttpServlet.java:590) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:320) + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:115) + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:90) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:118) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:84) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:111) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:158) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at com.mingchen.common.config.JwtFilter.doFilter(JwtFilter.java:68) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:200) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:116) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:103) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:103) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:105) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:103) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:215) + at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:178) + at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:358) + at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:271) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:712) + at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:461) + at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:384) + at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:312) + at org.apache.catalina.core.StandardHostValve.custom(StandardHostValve.java:394) + at org.apache.catalina.core.StandardHostValve.status(StandardHostValve.java:253) + at org.apache.catalina.core.StandardHostValve.throwable(StandardHostValve.java:348) + at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:173) + at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) + at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) + at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) + at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:373) + at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) + at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868) + at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1590) + at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) + at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) + at java.base/java.lang.Thread.run(Thread.java:840) +Caused by: java.io.IOException: Broken pipe + at java.base/sun.nio.ch.FileDispatcherImpl.write0(Native Method) + at java.base/sun.nio.ch.SocketDispatcher.write(SocketDispatcher.java:62) + at java.base/sun.nio.ch.IOUtil.writeFromNativeBuffer(IOUtil.java:132) + at java.base/sun.nio.ch.IOUtil.write(IOUtil.java:97) + at java.base/sun.nio.ch.IOUtil.write(IOUtil.java:53) + at java.base/sun.nio.ch.SocketChannelImpl.write(SocketChannelImpl.java:532) + at org.apache.tomcat.util.net.NioChannel.write(NioChannel.java:138) + at org.apache.tomcat.util.net.NioBlockingSelector.write(NioBlockingSelector.java:101) + at org.apache.tomcat.util.net.NioSelectorPool.write(NioSelectorPool.java:152) + at org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper.doWrite(NioEndpoint.java:1253) + at org.apache.tomcat.util.net.SocketWrapperBase.doWrite(SocketWrapperBase.java:740) + at org.apache.tomcat.util.net.SocketWrapperBase.writeBlocking(SocketWrapperBase.java:560) + at org.apache.tomcat.util.net.SocketWrapperBase.write(SocketWrapperBase.java:504) + at org.apache.coyote.http11.Http11OutputBuffer$SocketOutputBuffer.doWrite(Http11OutputBuffer.java:538) + at org.apache.coyote.http11.filters.ChunkedOutputFilter.doWrite(ChunkedOutputFilter.java:112) + at org.apache.coyote.http11.Http11OutputBuffer.doWrite(Http11OutputBuffer.java:190) + at org.apache.coyote.Response.doWrite(Response.java:601) + at org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:339) + ... 80 common frames omitted + +2025-04-16 11:26:47.247 DEBUG 11723 --- [http-nio-9092-exec-10] c.mingchen.common.config.JwtLoginFilter : Request is to process authentication +2025-04-16 11:26:47.302 INFO 11723 --- [http-nio-9092-exec-10] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting... +2025-04-16 11:26:47.791 INFO 11723 --- [http-nio-9092-exec-10] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed. +2025-04-16 11:26:47.803 DEBUG 11723 --- [http-nio-9092-exec-10] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-16 11:26:47.825 DEBUG 11723 --- [http-nio-9092-exec-10] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-16 11:26:47.894 DEBUG 11723 --- [http-nio-9092-exec-10] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-16 11:28:40.755 DEBUG 11723 --- [http-nio-9092-exec-2] c.mingchen.common.config.JwtLoginFilter : Request is to process authentication +2025-04-16 11:28:40.804 DEBUG 11723 --- [http-nio-9092-exec-2] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-16 11:28:40.805 DEBUG 11723 --- [http-nio-9092-exec-2] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-16 11:28:40.853 DEBUG 11723 --- [http-nio-9092-exec-2] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-16 11:29:31.147 ERROR 11723 --- [http-nio-9092-exec-5] org.thymeleaf.TemplateEngine : [THYMELEAF][http-nio-9092-exec-5] Exception processing template "admin/ai": Error resolving template [admin/ai], template might not exist or might not be accessible by any of the configured Template Resolvers + +org.thymeleaf.exceptions.TemplateInputException: Error resolving template [admin/ai], template might not exist or might not be accessible by any of the configured Template Resolvers + at org.thymeleaf.engine.TemplateManager.resolveTemplate(TemplateManager.java:869) + at org.thymeleaf.engine.TemplateManager.parseAndProcess(TemplateManager.java:607) + at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1098) + at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1072) + at org.thymeleaf.spring5.view.ThymeleafView.renderFragment(ThymeleafView.java:362) + at org.thymeleaf.spring5.view.ThymeleafView.render(ThymeleafView.java:189) + at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1373) + at org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1118) + at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1057) + at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943) + at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) + at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909) + at javax.servlet.http.HttpServlet.service(HttpServlet.java:523) + at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) + at javax.servlet.http.HttpServlet.service(HttpServlet.java:590) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:320) + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:126) + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:90) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:118) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:137) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:111) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:158) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at com.mingchen.common.config.JwtFilter.doFilter(JwtFilter.java:68) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:200) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:116) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:92) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:92) + at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:77) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:105) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:56) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:215) + at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:178) + at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:358) + at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:271) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202) + at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) + at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541) + at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139) + at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) + at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) + at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) + at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:373) + at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) + at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868) + at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1590) + at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) + at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) + at java.base/java.lang.Thread.run(Thread.java:840) + +2025-04-16 11:29:31.148 ERROR 11723 --- [http-nio-9092-exec-5] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.thymeleaf.exceptions.TemplateInputException: Error resolving template [admin/ai], template might not exist or might not be accessible by any of the configured Template Resolvers] with root cause + +org.thymeleaf.exceptions.TemplateInputException: Error resolving template [admin/ai], template might not exist or might not be accessible by any of the configured Template Resolvers + at org.thymeleaf.engine.TemplateManager.resolveTemplate(TemplateManager.java:869) + at org.thymeleaf.engine.TemplateManager.parseAndProcess(TemplateManager.java:607) + at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1098) + at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1072) + at org.thymeleaf.spring5.view.ThymeleafView.renderFragment(ThymeleafView.java:362) + at org.thymeleaf.spring5.view.ThymeleafView.render(ThymeleafView.java:189) + at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1373) + at org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1118) + at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1057) + at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943) + at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) + at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909) + at javax.servlet.http.HttpServlet.service(HttpServlet.java:523) + at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) + at javax.servlet.http.HttpServlet.service(HttpServlet.java:590) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:320) + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:126) + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:90) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:118) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:137) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:111) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:158) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at com.mingchen.common.config.JwtFilter.doFilter(JwtFilter.java:68) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:200) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:116) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:92) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:92) + at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:77) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:105) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:56) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:215) + at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:178) + at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:358) + at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:271) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202) + at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) + at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541) + at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139) + at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) + at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) + at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) + at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:373) + at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) + at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868) + at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1590) + at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) + at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) + at java.base/java.lang.Thread.run(Thread.java:840) + +2025-04-16 11:46:46.022 WARN 11723 --- [HikariPool-1 housekeeper] com.zaxxer.hikari.pool.HikariPool : HikariPool-1 - Thread starvation or clock leap detected (housekeeper delta=15m56s657ms). +2025-04-16 12:14:03.839 WARN 11723 --- [HikariPool-1 housekeeper] com.zaxxer.hikari.pool.HikariPool : HikariPool-1 - Thread starvation or clock leap detected (housekeeper delta=17m17s672ms). +2025-04-16 12:30:33.370 WARN 11723 --- [HikariPool-1 housekeeper] com.zaxxer.hikari.pool.HikariPool : HikariPool-1 - Thread starvation or clock leap detected (housekeeper delta=16m29s531ms). +2025-04-16 12:47:46.017 WARN 11723 --- [HikariPool-1 housekeeper] com.zaxxer.hikari.pool.HikariPool : HikariPool-1 - Thread starvation or clock leap detected (housekeeper delta=16m42s640ms). +2025-04-16 13:00:37.584 WARN 11723 --- [HikariPool-1 housekeeper] com.zaxxer.hikari.pool.HikariPool : HikariPool-1 - Thread starvation or clock leap detected (housekeeper delta=11m51s558ms). +2025-04-16 13:01:23.386 INFO 11723 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED paused. +2025-04-16 13:01:23.388 INFO 11723 --- [SpringContextShutdownHook] o.s.s.quartz.SchedulerFactoryBean : Shutting down Quartz Scheduler +2025-04-16 13:01:23.388 INFO 11723 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED shutting down. +2025-04-16 13:01:23.388 INFO 11723 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED paused. +2025-04-16 13:01:23.388 INFO 11723 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED shutdown complete. +2025-04-16 13:01:23.388 INFO 11723 --- [SpringContextShutdownHook] o.s.s.concurrent.ThreadPoolTaskExecutor : Shutting down ExecutorService 'applicationTaskExecutor' +2025-04-16 13:01:23.395 INFO 11723 --- [SpringContextShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown initiated... +2025-04-16 13:01:23.401 INFO 11723 --- [SpringContextShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown completed. +2025-04-16 13:01:25.775 INFO 12237 --- [restartedMain] com.mingchen.BlogApiApplication : Starting BlogApiApplication on mingchendeMac-mini.local with PID 12237 (/Users/mingchen/code/java/other/legalAid/api/target/classes started by mingchen in /Users/mingchen/code/java/other/legalAid) +2025-04-16 13:01:25.776 DEBUG 12237 --- [restartedMain] com.mingchen.BlogApiApplication : Running with Spring Boot v2.2.7.RELEASE, Spring v5.2.6.RELEASE +2025-04-16 13:01:25.776 INFO 12237 --- [restartedMain] com.mingchen.BlogApiApplication : The following profiles are active: dev +2025-04-16 13:01:25.809 INFO 12237 --- [restartedMain] o.s.b.devtools.restart.ChangeableUrls : The Class-Path manifest attribute in /usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/jaxb-runtime-2.3.1.jar referenced one or more files that do not exist: file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/jaxb-api-2.3.1.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/txw2-2.3.1.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/istack-commons-runtime-3.0.7.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/stax-ex-1.8.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/FastInfoset-1.2.15.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/javax.activation-api-1.2.0.jar +2025-04-16 13:01:25.809 INFO 12237 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : Devtools property defaults active! Set 'spring.devtools.add-properties' to 'false' to disable +2025-04-16 13:01:25.809 INFO 12237 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : For additional web related logging consider setting the 'logging.level.web' property to 'DEBUG' +2025-04-16 13:01:26.060 INFO 12237 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Multiple Spring Data modules found, entering strict repository configuration mode! +2025-04-16 13:01:26.061 INFO 12237 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data Redis repositories in DEFAULT mode. +2025-04-16 13:01:26.073 INFO 12237 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 7ms. Found 0 Redis repository interfaces. +2025-04-16 13:01:26.324 INFO 12237 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 9092 (http) +2025-04-16 13:01:26.327 INFO 12237 --- [restartedMain] o.apache.catalina.core.StandardService : Starting service [Tomcat] +2025-04-16 13:01:26.327 INFO 12237 --- [restartedMain] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.34] +2025-04-16 13:01:26.351 INFO 12237 --- [restartedMain] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext +2025-04-16 13:01:26.351 INFO 12237 --- [restartedMain] o.s.web.context.ContextLoader : Root WebApplicationContext: initialization completed in 542 ms +2025-04-16 13:01:26.819 INFO 12237 --- [restartedMain] n.b.p.u.AbstractUserAgentAnalyzerDirect : - Loaded 90 files in 206 msec using expression: classpath*:UserAgents/**/*.yaml +2025-04-16 13:01:26.819 INFO 12237 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : +2025-04-16 13:01:26.819 INFO 12237 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : /-----------------------------------------------------------\ +2025-04-16 13:01:26.819 INFO 12237 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : | Yauaa 5.20 (v5.20 @ 2020-11-22T15:39:16Z) | +2025-04-16 13:01:26.820 INFO 12237 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : +-----------------------------------------------------------+ +2025-04-16 13:01:26.820 INFO 12237 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : | For more information: https://yauaa.basjes.nl | +2025-04-16 13:01:26.820 INFO 12237 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : | Copyright (C) 2013-2020 Niels Basjes - License Apache 2.0 | +2025-04-16 13:01:26.820 INFO 12237 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : \-----------------------------------------------------------/ +2025-04-16 13:01:26.820 INFO 12237 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : +2025-04-16 13:01:26.824 INFO 12237 --- [restartedMain] n.b.p.u.AbstractUserAgentAnalyzerDirect : Building all needed matchers for the requested 11 fields. +2025-04-16 13:01:26.877 INFO 12237 --- [restartedMain] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor' +2025-04-16 13:01:26.959 INFO 12237 --- [restartedMain] org.quartz.impl.StdSchedulerFactory : Using default implementation for ThreadExecutor +2025-04-16 13:01:26.963 INFO 12237 --- [restartedMain] org.quartz.core.SchedulerSignalerImpl : Initialized Scheduler Signaller of type: class org.quartz.core.SchedulerSignalerImpl +2025-04-16 13:01:26.963 INFO 12237 --- [restartedMain] org.quartz.core.QuartzScheduler : Quartz Scheduler v.2.3.2 created. +2025-04-16 13:01:26.963 INFO 12237 --- [restartedMain] org.quartz.simpl.RAMJobStore : RAMJobStore initialized. +2025-04-16 13:01:26.964 INFO 12237 --- [restartedMain] org.quartz.core.QuartzScheduler : Scheduler meta-data: Quartz Scheduler (v2.3.2) 'quartzScheduler' with instanceId 'NON_CLUSTERED' + Scheduler class: 'org.quartz.core.QuartzScheduler' - running locally. + NOT STARTED. + Currently in standby mode. + Number of jobs executed: 0 + Using thread pool 'org.quartz.simpl.SimpleThreadPool' - with 10 threads. + Using job-store 'org.quartz.simpl.RAMJobStore' - which does not support persistence. and is not clustered. + +2025-04-16 13:01:26.964 INFO 12237 --- [restartedMain] org.quartz.impl.StdSchedulerFactory : Quartz scheduler 'quartzScheduler' initialized from an externally provided properties instance. +2025-04-16 13:01:26.964 INFO 12237 --- [restartedMain] org.quartz.impl.StdSchedulerFactory : Quartz scheduler version: 2.3.2 +2025-04-16 13:01:26.964 INFO 12237 --- [restartedMain] org.quartz.core.QuartzScheduler : JobFactory set to: org.springframework.scheduling.quartz.SpringBeanJobFactory@75d85644 +2025-04-16 13:01:26.996 INFO 12237 --- [restartedMain] o.s.s.web.DefaultSecurityFilterChain : Creating filter chain: any request, [org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter@611ef776, org.springframework.security.web.context.SecurityContextPersistenceFilter@69b267c2, org.springframework.security.web.header.HeaderWriterFilter@399e4c65, org.springframework.web.filter.CorsFilter@23ebe9c, org.springframework.security.web.authentication.logout.LogoutFilter@4c3062c8, com.mingchen.common.config.JwtLoginFilter@4853442b, com.mingchen.common.config.JwtFilter@1d87a3cc, org.springframework.security.web.savedrequest.RequestCacheAwareFilter@7e9edf71, org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter@41711262, org.springframework.security.web.authentication.AnonymousAuthenticationFilter@bb4424d, org.springframework.security.web.session.SessionManagementFilter@1da7ff8d, org.springframework.security.web.access.ExceptionTranslationFilter@6a78d862, org.springframework.security.web.access.intercept.FilterSecurityInterceptor@2fbdce05] +2025-04-16 13:01:27.008 INFO 12237 --- [restartedMain] o.s.b.d.a.OptionalLiveReloadServer : LiveReload server is running on port 35729 +2025-04-16 13:01:27.016 INFO 12237 --- [restartedMain] o.s.s.quartz.SchedulerFactoryBean : Starting Quartz Scheduler now +2025-04-16 13:01:27.016 INFO 12237 --- [restartedMain] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED started. +2025-04-16 13:01:27.031 INFO 12237 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 9092 (http) with context path '' +2025-04-16 13:01:27.033 INFO 12237 --- [restartedMain] com.mingchen.BlogApiApplication : Started BlogApiApplication in 1.491 seconds (JVM running for 1.766) +2025-04-16 13:06:10.092 INFO 12237 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED paused. +2025-04-16 13:06:10.094 INFO 12237 --- [SpringContextShutdownHook] o.s.s.quartz.SchedulerFactoryBean : Shutting down Quartz Scheduler +2025-04-16 13:06:10.094 INFO 12237 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED shutting down. +2025-04-16 13:06:10.094 INFO 12237 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED paused. +2025-04-16 13:06:10.094 INFO 12237 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED shutdown complete. +2025-04-16 13:06:10.094 INFO 12237 --- [SpringContextShutdownHook] o.s.s.concurrent.ThreadPoolTaskExecutor : Shutting down ExecutorService 'applicationTaskExecutor' +2025-04-16 13:06:12.228 INFO 12345 --- [restartedMain] com.mingchen.BlogApiApplication : Starting BlogApiApplication on mingchendeMac-mini.local with PID 12345 (/Users/mingchen/code/java/other/legalAid/api/target/classes started by mingchen in /Users/mingchen/code/java/other/legalAid) +2025-04-16 13:06:12.229 DEBUG 12345 --- [restartedMain] com.mingchen.BlogApiApplication : Running with Spring Boot v2.2.7.RELEASE, Spring v5.2.6.RELEASE +2025-04-16 13:06:12.229 INFO 12345 --- [restartedMain] com.mingchen.BlogApiApplication : The following profiles are active: dev +2025-04-16 13:06:12.243 INFO 12345 --- [restartedMain] o.s.b.devtools.restart.ChangeableUrls : The Class-Path manifest attribute in /usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/jaxb-runtime-2.3.1.jar referenced one or more files that do not exist: file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/jaxb-api-2.3.1.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/txw2-2.3.1.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/istack-commons-runtime-3.0.7.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/stax-ex-1.8.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/FastInfoset-1.2.15.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/javax.activation-api-1.2.0.jar +2025-04-16 13:06:12.243 INFO 12345 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : Devtools property defaults active! Set 'spring.devtools.add-properties' to 'false' to disable +2025-04-16 13:06:12.243 INFO 12345 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : For additional web related logging consider setting the 'logging.level.web' property to 'DEBUG' +2025-04-16 13:06:12.465 INFO 12345 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Multiple Spring Data modules found, entering strict repository configuration mode! +2025-04-16 13:06:12.466 INFO 12345 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data Redis repositories in DEFAULT mode. +2025-04-16 13:06:12.481 INFO 12345 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 8ms. Found 0 Redis repository interfaces. +2025-04-16 13:06:12.728 INFO 12345 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 9092 (http) +2025-04-16 13:06:12.731 INFO 12345 --- [restartedMain] o.apache.catalina.core.StandardService : Starting service [Tomcat] +2025-04-16 13:06:12.731 INFO 12345 --- [restartedMain] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.34] +2025-04-16 13:06:12.753 INFO 12345 --- [restartedMain] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext +2025-04-16 13:06:12.753 INFO 12345 --- [restartedMain] o.s.web.context.ContextLoader : Root WebApplicationContext: initialization completed in 510 ms +2025-04-16 13:06:12.771 WARN 12345 --- [restartedMain] ConfigServletWebServerApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'apiController': Unsatisfied dependency expressed through field 'platformService'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'platformServiceImpl': Unsatisfied dependency expressed through field 'aiService'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.mingchen.api.sdk.AiService' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)} +2025-04-16 13:06:12.772 INFO 12345 --- [restartedMain] o.apache.catalina.core.StandardService : Stopping service [Tomcat] +2025-04-16 13:06:12.777 INFO 12345 --- [restartedMain] ConditionEvaluationReportLoggingListener : + +Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled. +2025-04-16 13:06:12.809 ERROR 12345 --- [restartedMain] o.s.b.d.LoggingFailureAnalysisReporter : + +*************************** +APPLICATION FAILED TO START +*************************** + +Description: + +Field aiService in com.mingchen.service.impl.PlatformServiceImpl required a bean of type 'com.mingchen.api.sdk.AiService' that could not be found. + +The injection point has the following annotations: + - @org.springframework.beans.factory.annotation.Autowired(required=true) + + +Action: + +Consider defining a bean of type 'com.mingchen.api.sdk.AiService' in your configuration. + +2025-04-16 13:06:30.511 INFO 12351 --- [restartedMain] com.mingchen.BlogApiApplication : Starting BlogApiApplication on mingchendeMac-mini.local with PID 12351 (/Users/mingchen/code/java/other/legalAid/api/target/classes started by mingchen in /Users/mingchen/code/java/other/legalAid) +2025-04-16 13:06:30.512 DEBUG 12351 --- [restartedMain] com.mingchen.BlogApiApplication : Running with Spring Boot v2.2.7.RELEASE, Spring v5.2.6.RELEASE +2025-04-16 13:06:30.512 INFO 12351 --- [restartedMain] com.mingchen.BlogApiApplication : The following profiles are active: dev +2025-04-16 13:06:30.527 INFO 12351 --- [restartedMain] o.s.b.devtools.restart.ChangeableUrls : The Class-Path manifest attribute in /usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/jaxb-runtime-2.3.1.jar referenced one or more files that do not exist: file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/jaxb-api-2.3.1.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/txw2-2.3.1.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/istack-commons-runtime-3.0.7.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/stax-ex-1.8.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/FastInfoset-1.2.15.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/javax.activation-api-1.2.0.jar +2025-04-16 13:06:30.527 INFO 12351 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : Devtools property defaults active! Set 'spring.devtools.add-properties' to 'false' to disable +2025-04-16 13:06:30.527 INFO 12351 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : For additional web related logging consider setting the 'logging.level.web' property to 'DEBUG' +2025-04-16 13:06:30.707 INFO 12351 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Multiple Spring Data modules found, entering strict repository configuration mode! +2025-04-16 13:06:30.708 INFO 12351 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data Redis repositories in DEFAULT mode. +2025-04-16 13:06:30.718 INFO 12351 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 6ms. Found 0 Redis repository interfaces. +2025-04-16 13:06:30.957 INFO 12351 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 9092 (http) +2025-04-16 13:06:30.960 INFO 12351 --- [restartedMain] o.apache.catalina.core.StandardService : Starting service [Tomcat] +2025-04-16 13:06:30.960 INFO 12351 --- [restartedMain] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.34] +2025-04-16 13:06:30.980 INFO 12351 --- [restartedMain] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext +2025-04-16 13:06:30.980 INFO 12351 --- [restartedMain] o.s.web.context.ContextLoader : Root WebApplicationContext: initialization completed in 453 ms +2025-04-16 13:06:31.438 INFO 12351 --- [restartedMain] n.b.p.u.AbstractUserAgentAnalyzerDirect : - Loaded 90 files in 203 msec using expression: classpath*:UserAgents/**/*.yaml +2025-04-16 13:06:31.438 INFO 12351 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : +2025-04-16 13:06:31.438 INFO 12351 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : /-----------------------------------------------------------\ +2025-04-16 13:06:31.438 INFO 12351 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : | Yauaa 5.20 (v5.20 @ 2020-11-22T15:39:16Z) | +2025-04-16 13:06:31.438 INFO 12351 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : +-----------------------------------------------------------+ +2025-04-16 13:06:31.438 INFO 12351 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : | For more information: https://yauaa.basjes.nl | +2025-04-16 13:06:31.438 INFO 12351 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : | Copyright (C) 2013-2020 Niels Basjes - License Apache 2.0 | +2025-04-16 13:06:31.438 INFO 12351 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : \-----------------------------------------------------------/ +2025-04-16 13:06:31.438 INFO 12351 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : +2025-04-16 13:06:31.441 INFO 12351 --- [restartedMain] n.b.p.u.AbstractUserAgentAnalyzerDirect : Building all needed matchers for the requested 11 fields. +2025-04-16 13:06:31.490 INFO 12351 --- [restartedMain] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor' +2025-04-16 13:06:31.573 INFO 12351 --- [restartedMain] org.quartz.impl.StdSchedulerFactory : Using default implementation for ThreadExecutor +2025-04-16 13:06:31.577 INFO 12351 --- [restartedMain] org.quartz.core.SchedulerSignalerImpl : Initialized Scheduler Signaller of type: class org.quartz.core.SchedulerSignalerImpl +2025-04-16 13:06:31.577 INFO 12351 --- [restartedMain] org.quartz.core.QuartzScheduler : Quartz Scheduler v.2.3.2 created. +2025-04-16 13:06:31.577 INFO 12351 --- [restartedMain] org.quartz.simpl.RAMJobStore : RAMJobStore initialized. +2025-04-16 13:06:31.577 INFO 12351 --- [restartedMain] org.quartz.core.QuartzScheduler : Scheduler meta-data: Quartz Scheduler (v2.3.2) 'quartzScheduler' with instanceId 'NON_CLUSTERED' + Scheduler class: 'org.quartz.core.QuartzScheduler' - running locally. + NOT STARTED. + Currently in standby mode. + Number of jobs executed: 0 + Using thread pool 'org.quartz.simpl.SimpleThreadPool' - with 10 threads. + Using job-store 'org.quartz.simpl.RAMJobStore' - which does not support persistence. and is not clustered. + +2025-04-16 13:06:31.577 INFO 12351 --- [restartedMain] org.quartz.impl.StdSchedulerFactory : Quartz scheduler 'quartzScheduler' initialized from an externally provided properties instance. +2025-04-16 13:06:31.577 INFO 12351 --- [restartedMain] org.quartz.impl.StdSchedulerFactory : Quartz scheduler version: 2.3.2 +2025-04-16 13:06:31.577 INFO 12351 --- [restartedMain] org.quartz.core.QuartzScheduler : JobFactory set to: org.springframework.scheduling.quartz.SpringBeanJobFactory@2112b8ea +2025-04-16 13:06:31.608 INFO 12351 --- [restartedMain] o.s.s.web.DefaultSecurityFilterChain : Creating filter chain: any request, [org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter@39cfecec, org.springframework.security.web.context.SecurityContextPersistenceFilter@1cb8dbae, org.springframework.security.web.header.HeaderWriterFilter@698a175, org.springframework.web.filter.CorsFilter@541087ea, org.springframework.security.web.authentication.logout.LogoutFilter@48074a4e, com.mingchen.common.config.JwtLoginFilter@4425c3b1, com.mingchen.common.config.JwtFilter@699b4b80, org.springframework.security.web.savedrequest.RequestCacheAwareFilter@790c2757, org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter@34f60137, org.springframework.security.web.authentication.AnonymousAuthenticationFilter@2ff562d3, org.springframework.security.web.session.SessionManagementFilter@73b53581, org.springframework.security.web.access.ExceptionTranslationFilter@4b87764, org.springframework.security.web.access.intercept.FilterSecurityInterceptor@4882ed0f] +2025-04-16 13:06:31.620 INFO 12351 --- [restartedMain] o.s.b.d.a.OptionalLiveReloadServer : LiveReload server is running on port 35729 +2025-04-16 13:06:31.627 INFO 12351 --- [restartedMain] o.s.s.quartz.SchedulerFactoryBean : Starting Quartz Scheduler now +2025-04-16 13:06:31.627 INFO 12351 --- [restartedMain] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED started. +2025-04-16 13:06:31.635 INFO 12351 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 9092 (http) with context path '' +2025-04-16 13:06:31.637 INFO 12351 --- [restartedMain] com.mingchen.BlogApiApplication : Started BlogApiApplication in 1.26 seconds (JVM running for 1.484) +2025-04-16 13:06:47.897 INFO 12351 --- [http-nio-9092-exec-2] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet' +2025-04-16 13:06:47.898 INFO 12351 --- [http-nio-9092-exec-2] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet' +2025-04-16 13:06:47.900 INFO 12351 --- [http-nio-9092-exec-2] o.s.web.servlet.DispatcherServlet : Completed initialization in 2 ms +2025-04-16 13:07:01.937 ERROR 12351 --- [http-nio-9092-exec-2] org.thymeleaf.TemplateEngine : [THYMELEAF][http-nio-9092-exec-2] Exception processing template "admin/ai": Error resolving template [admin/ai], template might not exist or might not be accessible by any of the configured Template Resolvers + +org.thymeleaf.exceptions.TemplateInputException: Error resolving template [admin/ai], template might not exist or might not be accessible by any of the configured Template Resolvers + at org.thymeleaf.engine.TemplateManager.resolveTemplate(TemplateManager.java:869) + at org.thymeleaf.engine.TemplateManager.parseAndProcess(TemplateManager.java:607) + at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1098) + at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1072) + at org.thymeleaf.spring5.view.ThymeleafView.renderFragment(ThymeleafView.java:362) + at org.thymeleaf.spring5.view.ThymeleafView.render(ThymeleafView.java:189) + at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1373) + at org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1118) + at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1057) + at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943) + at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) + at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909) + at javax.servlet.http.HttpServlet.service(HttpServlet.java:523) + at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) + at javax.servlet.http.HttpServlet.service(HttpServlet.java:590) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:320) + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:126) + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:90) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:118) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:137) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:111) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:158) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at com.mingchen.common.config.JwtFilter.doFilter(JwtFilter.java:68) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:200) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:116) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:92) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:92) + at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:77) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:105) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:56) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:215) + at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:178) + at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:358) + at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:271) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202) + at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) + at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541) + at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139) + at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) + at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) + at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) + at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:373) + at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) + at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868) + at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1590) + at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) + at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) + at java.base/java.lang.Thread.run(Thread.java:840) + +2025-04-16 13:07:01.938 ERROR 12351 --- [http-nio-9092-exec-2] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.thymeleaf.exceptions.TemplateInputException: Error resolving template [admin/ai], template might not exist or might not be accessible by any of the configured Template Resolvers] with root cause + +org.thymeleaf.exceptions.TemplateInputException: Error resolving template [admin/ai], template might not exist or might not be accessible by any of the configured Template Resolvers + at org.thymeleaf.engine.TemplateManager.resolveTemplate(TemplateManager.java:869) + at org.thymeleaf.engine.TemplateManager.parseAndProcess(TemplateManager.java:607) + at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1098) + at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1072) + at org.thymeleaf.spring5.view.ThymeleafView.renderFragment(ThymeleafView.java:362) + at org.thymeleaf.spring5.view.ThymeleafView.render(ThymeleafView.java:189) + at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1373) + at org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1118) + at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1057) + at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943) + at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) + at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909) + at javax.servlet.http.HttpServlet.service(HttpServlet.java:523) + at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) + at javax.servlet.http.HttpServlet.service(HttpServlet.java:590) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:320) + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:126) + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:90) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:118) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:137) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:111) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:158) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at com.mingchen.common.config.JwtFilter.doFilter(JwtFilter.java:68) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:200) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:116) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:92) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:92) + at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:77) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:105) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:56) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:215) + at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:178) + at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:358) + at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:271) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202) + at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) + at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541) + at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139) + at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) + at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) + at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) + at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:373) + at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) + at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868) + at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1590) + at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) + at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) + at java.base/java.lang.Thread.run(Thread.java:840) + +2025-04-16 13:08:06.808 INFO 12351 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED paused. +2025-04-16 13:08:06.810 INFO 12351 --- [SpringContextShutdownHook] o.s.s.quartz.SchedulerFactoryBean : Shutting down Quartz Scheduler +2025-04-16 13:08:06.810 INFO 12351 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED shutting down. +2025-04-16 13:08:06.810 INFO 12351 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED paused. +2025-04-16 13:08:06.810 INFO 12351 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED shutdown complete. +2025-04-16 13:08:06.810 INFO 12351 --- [SpringContextShutdownHook] o.s.s.concurrent.ThreadPoolTaskExecutor : Shutting down ExecutorService 'applicationTaskExecutor' +2025-04-16 13:08:08.953 INFO 12378 --- [restartedMain] com.mingchen.BlogApiApplication : Starting BlogApiApplication on mingchendeMac-mini.local with PID 12378 (/Users/mingchen/code/java/other/legalAid/api/target/classes started by mingchen in /Users/mingchen/code/java/other/legalAid) +2025-04-16 13:08:08.954 DEBUG 12378 --- [restartedMain] com.mingchen.BlogApiApplication : Running with Spring Boot v2.2.7.RELEASE, Spring v5.2.6.RELEASE +2025-04-16 13:08:08.955 INFO 12378 --- [restartedMain] com.mingchen.BlogApiApplication : The following profiles are active: dev +2025-04-16 13:08:08.971 INFO 12378 --- [restartedMain] o.s.b.devtools.restart.ChangeableUrls : The Class-Path manifest attribute in /usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/jaxb-runtime-2.3.1.jar referenced one or more files that do not exist: file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/jaxb-api-2.3.1.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/txw2-2.3.1.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/istack-commons-runtime-3.0.7.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/stax-ex-1.8.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/FastInfoset-1.2.15.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/javax.activation-api-1.2.0.jar +2025-04-16 13:08:08.971 INFO 12378 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : Devtools property defaults active! Set 'spring.devtools.add-properties' to 'false' to disable +2025-04-16 13:08:08.971 INFO 12378 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : For additional web related logging consider setting the 'logging.level.web' property to 'DEBUG' +2025-04-16 13:08:09.176 INFO 12378 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Multiple Spring Data modules found, entering strict repository configuration mode! +2025-04-16 13:08:09.177 INFO 12378 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data Redis repositories in DEFAULT mode. +2025-04-16 13:08:09.189 INFO 12378 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 7ms. Found 0 Redis repository interfaces. +2025-04-16 13:08:09.440 INFO 12378 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 9092 (http) +2025-04-16 13:08:09.443 INFO 12378 --- [restartedMain] o.apache.catalina.core.StandardService : Starting service [Tomcat] +2025-04-16 13:08:09.443 INFO 12378 --- [restartedMain] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.34] +2025-04-16 13:08:09.465 INFO 12378 --- [restartedMain] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext +2025-04-16 13:08:09.465 INFO 12378 --- [restartedMain] o.s.web.context.ContextLoader : Root WebApplicationContext: initialization completed in 494 ms +2025-04-16 13:08:09.935 INFO 12378 --- [restartedMain] n.b.p.u.AbstractUserAgentAnalyzerDirect : - Loaded 90 files in 211 msec using expression: classpath*:UserAgents/**/*.yaml +2025-04-16 13:08:09.935 INFO 12378 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : +2025-04-16 13:08:09.935 INFO 12378 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : /-----------------------------------------------------------\ +2025-04-16 13:08:09.935 INFO 12378 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : | Yauaa 5.20 (v5.20 @ 2020-11-22T15:39:16Z) | +2025-04-16 13:08:09.935 INFO 12378 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : +-----------------------------------------------------------+ +2025-04-16 13:08:09.935 INFO 12378 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : | For more information: https://yauaa.basjes.nl | +2025-04-16 13:08:09.935 INFO 12378 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : | Copyright (C) 2013-2020 Niels Basjes - License Apache 2.0 | +2025-04-16 13:08:09.935 INFO 12378 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : \-----------------------------------------------------------/ +2025-04-16 13:08:09.935 INFO 12378 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : +2025-04-16 13:08:09.940 INFO 12378 --- [restartedMain] n.b.p.u.AbstractUserAgentAnalyzerDirect : Building all needed matchers for the requested 11 fields. +2025-04-16 13:08:09.990 INFO 12378 --- [restartedMain] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor' +2025-04-16 13:08:10.069 INFO 12378 --- [restartedMain] org.quartz.impl.StdSchedulerFactory : Using default implementation for ThreadExecutor +2025-04-16 13:08:10.073 INFO 12378 --- [restartedMain] org.quartz.core.SchedulerSignalerImpl : Initialized Scheduler Signaller of type: class org.quartz.core.SchedulerSignalerImpl +2025-04-16 13:08:10.073 INFO 12378 --- [restartedMain] org.quartz.core.QuartzScheduler : Quartz Scheduler v.2.3.2 created. +2025-04-16 13:08:10.073 INFO 12378 --- [restartedMain] org.quartz.simpl.RAMJobStore : RAMJobStore initialized. +2025-04-16 13:08:10.074 INFO 12378 --- [restartedMain] org.quartz.core.QuartzScheduler : Scheduler meta-data: Quartz Scheduler (v2.3.2) 'quartzScheduler' with instanceId 'NON_CLUSTERED' + Scheduler class: 'org.quartz.core.QuartzScheduler' - running locally. + NOT STARTED. + Currently in standby mode. + Number of jobs executed: 0 + Using thread pool 'org.quartz.simpl.SimpleThreadPool' - with 10 threads. + Using job-store 'org.quartz.simpl.RAMJobStore' - which does not support persistence. and is not clustered. + +2025-04-16 13:08:10.074 INFO 12378 --- [restartedMain] org.quartz.impl.StdSchedulerFactory : Quartz scheduler 'quartzScheduler' initialized from an externally provided properties instance. +2025-04-16 13:08:10.074 INFO 12378 --- [restartedMain] org.quartz.impl.StdSchedulerFactory : Quartz scheduler version: 2.3.2 +2025-04-16 13:08:10.074 INFO 12378 --- [restartedMain] org.quartz.core.QuartzScheduler : JobFactory set to: org.springframework.scheduling.quartz.SpringBeanJobFactory@4dbc31a4 +2025-04-16 13:08:10.105 INFO 12378 --- [restartedMain] o.s.s.web.DefaultSecurityFilterChain : Creating filter chain: any request, [org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter@7a6dd0dd, org.springframework.security.web.context.SecurityContextPersistenceFilter@54560c99, org.springframework.security.web.header.HeaderWriterFilter@365cf8ad, org.springframework.web.filter.CorsFilter@484f7068, org.springframework.security.web.authentication.logout.LogoutFilter@3cc24fa7, com.mingchen.common.config.JwtLoginFilter@24d153b7, com.mingchen.common.config.JwtFilter@3bdca46d, org.springframework.security.web.savedrequest.RequestCacheAwareFilter@699a9b03, org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter@4cf787fb, org.springframework.security.web.authentication.AnonymousAuthenticationFilter@2fa360f3, org.springframework.security.web.session.SessionManagementFilter@6f4e02c5, org.springframework.security.web.access.ExceptionTranslationFilter@4a5adc48, org.springframework.security.web.access.intercept.FilterSecurityInterceptor@136ed13b] +2025-04-16 13:08:10.116 INFO 12378 --- [restartedMain] o.s.b.d.a.OptionalLiveReloadServer : LiveReload server is running on port 35729 +2025-04-16 13:08:10.123 INFO 12378 --- [restartedMain] o.s.s.quartz.SchedulerFactoryBean : Starting Quartz Scheduler now +2025-04-16 13:08:10.123 INFO 12378 --- [restartedMain] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED started. +2025-04-16 13:08:10.132 INFO 12378 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 9092 (http) with context path '' +2025-04-16 13:08:10.134 INFO 12378 --- [restartedMain] com.mingchen.BlogApiApplication : Started BlogApiApplication in 1.318 seconds (JVM running for 1.554) +2025-04-16 13:08:29.550 INFO 12378 --- [http-nio-9092-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet' +2025-04-16 13:08:29.551 INFO 12378 --- [http-nio-9092-exec-1] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet' +2025-04-16 13:08:29.554 INFO 12378 --- [http-nio-9092-exec-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 3 ms +2025-04-16 13:09:12.787 ERROR 12378 --- [http-nio-9092-exec-1] org.thymeleaf.TemplateEngine : [THYMELEAF][http-nio-9092-exec-1] Exception processing template "admin/ai": Error resolving template [admin/ai], template might not exist or might not be accessible by any of the configured Template Resolvers + +org.thymeleaf.exceptions.TemplateInputException: Error resolving template [admin/ai], template might not exist or might not be accessible by any of the configured Template Resolvers + at org.thymeleaf.engine.TemplateManager.resolveTemplate(TemplateManager.java:869) + at org.thymeleaf.engine.TemplateManager.parseAndProcess(TemplateManager.java:607) + at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1098) + at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1072) + at org.thymeleaf.spring5.view.ThymeleafView.renderFragment(ThymeleafView.java:362) + at org.thymeleaf.spring5.view.ThymeleafView.render(ThymeleafView.java:189) + at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1373) + at org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1118) + at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1057) + at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943) + at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) + at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909) + at javax.servlet.http.HttpServlet.service(HttpServlet.java:523) + at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) + at javax.servlet.http.HttpServlet.service(HttpServlet.java:590) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:320) + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:126) + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:90) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:118) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:137) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:111) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:158) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at com.mingchen.common.config.JwtFilter.doFilter(JwtFilter.java:68) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:200) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:116) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:92) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:92) + at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:77) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:105) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:56) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:215) + at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:178) + at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:358) + at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:271) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202) + at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) + at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541) + at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139) + at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) + at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) + at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) + at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:373) + at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) + at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868) + at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1590) + at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) + at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) + at java.base/java.lang.Thread.run(Thread.java:840) + +2025-04-16 13:09:12.788 ERROR 12378 --- [http-nio-9092-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.thymeleaf.exceptions.TemplateInputException: Error resolving template [admin/ai], template might not exist or might not be accessible by any of the configured Template Resolvers] with root cause + +org.thymeleaf.exceptions.TemplateInputException: Error resolving template [admin/ai], template might not exist or might not be accessible by any of the configured Template Resolvers + at org.thymeleaf.engine.TemplateManager.resolveTemplate(TemplateManager.java:869) + at org.thymeleaf.engine.TemplateManager.parseAndProcess(TemplateManager.java:607) + at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1098) + at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1072) + at org.thymeleaf.spring5.view.ThymeleafView.renderFragment(ThymeleafView.java:362) + at org.thymeleaf.spring5.view.ThymeleafView.render(ThymeleafView.java:189) + at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1373) + at org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1118) + at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1057) + at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943) + at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) + at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909) + at javax.servlet.http.HttpServlet.service(HttpServlet.java:523) + at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) + at javax.servlet.http.HttpServlet.service(HttpServlet.java:590) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:320) + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:126) + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:90) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:118) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:137) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:111) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:158) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at com.mingchen.common.config.JwtFilter.doFilter(JwtFilter.java:68) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:200) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:116) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:92) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:92) + at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:77) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:105) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:56) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:215) + at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:178) + at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:358) + at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:271) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202) + at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) + at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541) + at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139) + at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) + at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) + at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) + at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:373) + at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) + at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868) + at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1590) + at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) + at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) + at java.base/java.lang.Thread.run(Thread.java:840) + +2025-04-16 13:09:12.803 ERROR 12378 --- [http-nio-9092-exec-1] c.m.c.h.ControllerExceptionHandler : Request URL : http://localhost:9092/error, Exception : + +org.apache.catalina.connector.ClientAbortException: java.io.IOException: Broken pipe + at org.apache.catalina.connector.OutputBuffer.doFlush(OutputBuffer.java:309) + at org.apache.catalina.connector.OutputBuffer.flush(OutputBuffer.java:272) + at org.apache.catalina.connector.CoyoteOutputStream.flush(CoyoteOutputStream.java:118) + at com.fasterxml.jackson.core.json.UTF8JsonGenerator.flush(UTF8JsonGenerator.java:1153) + at com.fasterxml.jackson.databind.ObjectWriter.writeValue(ObjectWriter.java:923) + at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.writeInternal(AbstractJackson2HttpMessageConverter.java:287) + at org.springframework.http.converter.AbstractGenericHttpMessageConverter.write(AbstractGenericHttpMessageConverter.java:104) + at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor.writeWithMessageConverters(AbstractMessageConverterMethodProcessor.java:287) + at org.springframework.web.servlet.mvc.method.annotation.HttpEntityMethodProcessor.handleReturnValue(HttpEntityMethodProcessor.java:219) + at org.springframework.web.method.support.HandlerMethodReturnValueHandlerComposite.handleReturnValue(HandlerMethodReturnValueHandlerComposite.java:82) + at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:123) + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:879) + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:793) + at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) + at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1040) + at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943) + at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) + at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909) + at javax.servlet.http.HttpServlet.service(HttpServlet.java:523) + at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) + at javax.servlet.http.HttpServlet.service(HttpServlet.java:590) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:320) + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:115) + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:90) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:118) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:84) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:111) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:158) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at com.mingchen.common.config.JwtFilter.doFilter(JwtFilter.java:68) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:200) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:116) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:103) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:103) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:105) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:103) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:215) + at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:178) + at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:358) + at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:271) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:712) + at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:461) + at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:384) + at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:312) + at org.apache.catalina.core.StandardHostValve.custom(StandardHostValve.java:394) + at org.apache.catalina.core.StandardHostValve.status(StandardHostValve.java:253) + at org.apache.catalina.core.StandardHostValve.throwable(StandardHostValve.java:348) + at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:173) + at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) + at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) + at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) + at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:373) + at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) + at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868) + at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1590) + at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) + at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) + at java.base/java.lang.Thread.run(Thread.java:840) +Caused by: java.io.IOException: Broken pipe + at java.base/sun.nio.ch.FileDispatcherImpl.write0(Native Method) + at java.base/sun.nio.ch.SocketDispatcher.write(SocketDispatcher.java:62) + at java.base/sun.nio.ch.IOUtil.writeFromNativeBuffer(IOUtil.java:132) + at java.base/sun.nio.ch.IOUtil.write(IOUtil.java:97) + at java.base/sun.nio.ch.IOUtil.write(IOUtil.java:53) + at java.base/sun.nio.ch.SocketChannelImpl.write(SocketChannelImpl.java:532) + at org.apache.tomcat.util.net.NioChannel.write(NioChannel.java:138) + at org.apache.tomcat.util.net.NioBlockingSelector.write(NioBlockingSelector.java:101) + at org.apache.tomcat.util.net.NioSelectorPool.write(NioSelectorPool.java:152) + at org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper.doWrite(NioEndpoint.java:1253) + at org.apache.tomcat.util.net.SocketWrapperBase.doWrite(SocketWrapperBase.java:740) + at org.apache.tomcat.util.net.SocketWrapperBase.flushBlocking(SocketWrapperBase.java:693) + at org.apache.tomcat.util.net.SocketWrapperBase.flush(SocketWrapperBase.java:683) + at org.apache.coyote.http11.Http11OutputBuffer$SocketOutputBuffer.flush(Http11OutputBuffer.java:564) + at org.apache.coyote.http11.filters.ChunkedOutputFilter.flush(ChunkedOutputFilter.java:157) + at org.apache.coyote.http11.Http11OutputBuffer.flush(Http11OutputBuffer.java:217) + at org.apache.coyote.http11.Http11Processor.flush(Http11Processor.java:1155) + at org.apache.coyote.AbstractProcessor.action(AbstractProcessor.java:399) + at org.apache.coyote.Response.action(Response.java:209) + at org.apache.catalina.connector.OutputBuffer.doFlush(OutputBuffer.java:305) + ... 76 common frames omitted + +2025-04-16 13:09:12.806 WARN 12378 --- [http-nio-9092-exec-1] .m.m.a.ExceptionHandlerExceptionResolver : Failure in @ExceptionHandler com.mingchen.common.handler.ControllerExceptionHandler#exceptionHandler(HttpServletRequest, Exception) + +org.apache.catalina.connector.ClientAbortException: java.io.IOException: Broken pipe + at org.apache.catalina.connector.OutputBuffer.doFlush(OutputBuffer.java:309) + at org.apache.catalina.connector.OutputBuffer.flush(OutputBuffer.java:272) + at org.apache.catalina.connector.CoyoteOutputStream.flush(CoyoteOutputStream.java:118) + at com.fasterxml.jackson.core.json.UTF8JsonGenerator.flush(UTF8JsonGenerator.java:1153) + at com.fasterxml.jackson.databind.ObjectWriter.writeValue(ObjectWriter.java:923) + at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.writeInternal(AbstractJackson2HttpMessageConverter.java:287) + at org.springframework.http.converter.AbstractGenericHttpMessageConverter.write(AbstractGenericHttpMessageConverter.java:104) + at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor.writeWithMessageConverters(AbstractMessageConverterMethodProcessor.java:287) + at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.handleReturnValue(RequestResponseBodyMethodProcessor.java:181) + at org.springframework.web.method.support.HandlerMethodReturnValueHandlerComposite.handleReturnValue(HandlerMethodReturnValueHandlerComposite.java:82) + at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:123) + at org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver.doResolveHandlerMethodException(ExceptionHandlerExceptionResolver.java:403) + at org.springframework.web.servlet.handler.AbstractHandlerMethodExceptionResolver.doResolveException(AbstractHandlerMethodExceptionResolver.java:61) + at org.springframework.web.servlet.handler.AbstractHandlerExceptionResolver.resolveException(AbstractHandlerExceptionResolver.java:141) + at org.springframework.web.servlet.handler.HandlerExceptionResolverComposite.resolveException(HandlerExceptionResolverComposite.java:80) + at org.springframework.web.servlet.DispatcherServlet.processHandlerException(DispatcherServlet.java:1300) + at org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1111) + at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1057) + at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943) + at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) + at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909) + at javax.servlet.http.HttpServlet.service(HttpServlet.java:523) + at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) + at javax.servlet.http.HttpServlet.service(HttpServlet.java:590) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:320) + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:115) + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:90) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:118) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:84) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:111) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:158) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at com.mingchen.common.config.JwtFilter.doFilter(JwtFilter.java:68) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:200) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:116) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:103) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:103) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:105) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:103) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:215) + at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:178) + at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:358) + at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:271) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:712) + at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:461) + at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:384) + at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:312) + at org.apache.catalina.core.StandardHostValve.custom(StandardHostValve.java:394) + at org.apache.catalina.core.StandardHostValve.status(StandardHostValve.java:253) + at org.apache.catalina.core.StandardHostValve.throwable(StandardHostValve.java:348) + at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:173) + at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) + at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) + at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) + at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:373) + at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) + at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868) + at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1590) + at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) + at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) + at java.base/java.lang.Thread.run(Thread.java:840) +Caused by: java.io.IOException: Broken pipe + at java.base/sun.nio.ch.FileDispatcherImpl.write0(Native Method) + at java.base/sun.nio.ch.SocketDispatcher.write(SocketDispatcher.java:62) + at java.base/sun.nio.ch.IOUtil.writeFromNativeBuffer(IOUtil.java:132) + at java.base/sun.nio.ch.IOUtil.write(IOUtil.java:97) + at java.base/sun.nio.ch.IOUtil.write(IOUtil.java:53) + at java.base/sun.nio.ch.SocketChannelImpl.write(SocketChannelImpl.java:532) + at org.apache.tomcat.util.net.NioChannel.write(NioChannel.java:138) + at org.apache.tomcat.util.net.NioBlockingSelector.write(NioBlockingSelector.java:101) + at org.apache.tomcat.util.net.NioSelectorPool.write(NioSelectorPool.java:152) + at org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper.doWrite(NioEndpoint.java:1253) + at org.apache.tomcat.util.net.SocketWrapperBase.doWrite(SocketWrapperBase.java:740) + at org.apache.tomcat.util.net.SocketWrapperBase.flushBlocking(SocketWrapperBase.java:693) + at org.apache.tomcat.util.net.SocketWrapperBase.flush(SocketWrapperBase.java:683) + at org.apache.coyote.http11.Http11OutputBuffer$SocketOutputBuffer.flush(Http11OutputBuffer.java:564) + at org.apache.coyote.http11.filters.ChunkedOutputFilter.flush(ChunkedOutputFilter.java:157) + at org.apache.coyote.http11.Http11OutputBuffer.flush(Http11OutputBuffer.java:217) + at org.apache.coyote.http11.Http11Processor.flush(Http11Processor.java:1155) + at org.apache.coyote.AbstractProcessor.action(AbstractProcessor.java:399) + at org.apache.coyote.Response.action(Response.java:209) + at org.apache.catalina.connector.OutputBuffer.doFlush(OutputBuffer.java:305) + ... 79 common frames omitted + +2025-04-16 13:09:12.807 ERROR 12378 --- [http-nio-9092-exec-1] o.a.c.c.C.[Tomcat].[localhost] : Exception Processing ErrorPage[errorCode=0, location=/error] + +org.apache.catalina.connector.ClientAbortException: java.io.IOException: Broken pipe + at org.apache.catalina.connector.OutputBuffer.doFlush(OutputBuffer.java:309) + at org.apache.catalina.connector.OutputBuffer.flush(OutputBuffer.java:272) + at org.apache.catalina.connector.CoyoteOutputStream.flush(CoyoteOutputStream.java:118) + at com.fasterxml.jackson.core.json.UTF8JsonGenerator.flush(UTF8JsonGenerator.java:1153) + at com.fasterxml.jackson.databind.ObjectWriter.writeValue(ObjectWriter.java:923) + at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.writeInternal(AbstractJackson2HttpMessageConverter.java:287) + at org.springframework.http.converter.AbstractGenericHttpMessageConverter.write(AbstractGenericHttpMessageConverter.java:104) + at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor.writeWithMessageConverters(AbstractMessageConverterMethodProcessor.java:287) + at org.springframework.web.servlet.mvc.method.annotation.HttpEntityMethodProcessor.handleReturnValue(HttpEntityMethodProcessor.java:219) + at org.springframework.web.method.support.HandlerMethodReturnValueHandlerComposite.handleReturnValue(HandlerMethodReturnValueHandlerComposite.java:82) + at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:123) + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:879) + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:793) + at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) + at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1040) + at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943) + at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) + at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909) + at javax.servlet.http.HttpServlet.service(HttpServlet.java:523) + at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) + at javax.servlet.http.HttpServlet.service(HttpServlet.java:590) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:320) + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:115) + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:90) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:118) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:84) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:111) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:158) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at com.mingchen.common.config.JwtFilter.doFilter(JwtFilter.java:68) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:200) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:116) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:103) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:103) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:105) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:103) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:215) + at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:178) + at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:358) + at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:271) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:712) + at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:461) + at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:384) + at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:312) + at org.apache.catalina.core.StandardHostValve.custom(StandardHostValve.java:394) + at org.apache.catalina.core.StandardHostValve.status(StandardHostValve.java:253) + at org.apache.catalina.core.StandardHostValve.throwable(StandardHostValve.java:348) + at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:173) + at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) + at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) + at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) + at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:373) + at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) + at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868) + at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1590) + at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) + at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) + at java.base/java.lang.Thread.run(Thread.java:840) +Caused by: java.io.IOException: Broken pipe + at java.base/sun.nio.ch.FileDispatcherImpl.write0(Native Method) + at java.base/sun.nio.ch.SocketDispatcher.write(SocketDispatcher.java:62) + at java.base/sun.nio.ch.IOUtil.writeFromNativeBuffer(IOUtil.java:132) + at java.base/sun.nio.ch.IOUtil.write(IOUtil.java:97) + at java.base/sun.nio.ch.IOUtil.write(IOUtil.java:53) + at java.base/sun.nio.ch.SocketChannelImpl.write(SocketChannelImpl.java:532) + at org.apache.tomcat.util.net.NioChannel.write(NioChannel.java:138) + at org.apache.tomcat.util.net.NioBlockingSelector.write(NioBlockingSelector.java:101) + at org.apache.tomcat.util.net.NioSelectorPool.write(NioSelectorPool.java:152) + at org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper.doWrite(NioEndpoint.java:1253) + at org.apache.tomcat.util.net.SocketWrapperBase.doWrite(SocketWrapperBase.java:740) + at org.apache.tomcat.util.net.SocketWrapperBase.flushBlocking(SocketWrapperBase.java:693) + at org.apache.tomcat.util.net.SocketWrapperBase.flush(SocketWrapperBase.java:683) + at org.apache.coyote.http11.Http11OutputBuffer$SocketOutputBuffer.flush(Http11OutputBuffer.java:564) + at org.apache.coyote.http11.filters.ChunkedOutputFilter.flush(ChunkedOutputFilter.java:157) + at org.apache.coyote.http11.Http11OutputBuffer.flush(Http11OutputBuffer.java:217) + at org.apache.coyote.http11.Http11Processor.flush(Http11Processor.java:1155) + at org.apache.coyote.AbstractProcessor.action(AbstractProcessor.java:399) + at org.apache.coyote.Response.action(Response.java:209) + at org.apache.catalina.connector.OutputBuffer.doFlush(OutputBuffer.java:305) + ... 76 common frames omitted + +2025-04-16 13:09:49.774 INFO 12378 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED paused. +2025-04-16 13:09:49.776 INFO 12378 --- [SpringContextShutdownHook] o.s.s.quartz.SchedulerFactoryBean : Shutting down Quartz Scheduler +2025-04-16 13:09:49.776 INFO 12378 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED shutting down. +2025-04-16 13:09:49.776 INFO 12378 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED paused. +2025-04-16 13:09:49.776 INFO 12378 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED shutdown complete. +2025-04-16 13:09:49.776 INFO 12378 --- [SpringContextShutdownHook] o.s.s.concurrent.ThreadPoolTaskExecutor : Shutting down ExecutorService 'applicationTaskExecutor' +2025-04-16 13:09:51.906 INFO 12402 --- [restartedMain] com.mingchen.BlogApiApplication : Starting BlogApiApplication on mingchendeMac-mini.local with PID 12402 (/Users/mingchen/code/java/other/legalAid/api/target/classes started by mingchen in /Users/mingchen/code/java/other/legalAid) +2025-04-16 13:09:51.907 DEBUG 12402 --- [restartedMain] com.mingchen.BlogApiApplication : Running with Spring Boot v2.2.7.RELEASE, Spring v5.2.6.RELEASE +2025-04-16 13:09:51.907 INFO 12402 --- [restartedMain] com.mingchen.BlogApiApplication : The following profiles are active: dev +2025-04-16 13:09:51.923 INFO 12402 --- [restartedMain] o.s.b.devtools.restart.ChangeableUrls : The Class-Path manifest attribute in /usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/jaxb-runtime-2.3.1.jar referenced one or more files that do not exist: file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/jaxb-api-2.3.1.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/txw2-2.3.1.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/istack-commons-runtime-3.0.7.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/stax-ex-1.8.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/FastInfoset-1.2.15.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/javax.activation-api-1.2.0.jar +2025-04-16 13:09:51.923 INFO 12402 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : Devtools property defaults active! Set 'spring.devtools.add-properties' to 'false' to disable +2025-04-16 13:09:51.923 INFO 12402 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : For additional web related logging consider setting the 'logging.level.web' property to 'DEBUG' +2025-04-16 13:09:52.126 INFO 12402 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Multiple Spring Data modules found, entering strict repository configuration mode! +2025-04-16 13:09:52.127 INFO 12402 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data Redis repositories in DEFAULT mode. +2025-04-16 13:09:52.138 INFO 12402 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 6ms. Found 0 Redis repository interfaces. +2025-04-16 13:09:52.381 INFO 12402 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 9092 (http) +2025-04-16 13:09:52.384 INFO 12402 --- [restartedMain] o.apache.catalina.core.StandardService : Starting service [Tomcat] +2025-04-16 13:09:52.384 INFO 12402 --- [restartedMain] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.34] +2025-04-16 13:09:52.406 INFO 12402 --- [restartedMain] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext +2025-04-16 13:09:52.406 INFO 12402 --- [restartedMain] o.s.web.context.ContextLoader : Root WebApplicationContext: initialization completed in 483 ms +2025-04-16 13:09:52.877 INFO 12402 --- [restartedMain] n.b.p.u.AbstractUserAgentAnalyzerDirect : - Loaded 90 files in 206 msec using expression: classpath*:UserAgents/**/*.yaml +2025-04-16 13:09:52.877 INFO 12402 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : +2025-04-16 13:09:52.877 INFO 12402 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : /-----------------------------------------------------------\ +2025-04-16 13:09:52.877 INFO 12402 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : | Yauaa 5.20 (v5.20 @ 2020-11-22T15:39:16Z) | +2025-04-16 13:09:52.877 INFO 12402 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : +-----------------------------------------------------------+ +2025-04-16 13:09:52.877 INFO 12402 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : | For more information: https://yauaa.basjes.nl | +2025-04-16 13:09:52.877 INFO 12402 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : | Copyright (C) 2013-2020 Niels Basjes - License Apache 2.0 | +2025-04-16 13:09:52.877 INFO 12402 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : \-----------------------------------------------------------/ +2025-04-16 13:09:52.877 INFO 12402 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : +2025-04-16 13:09:52.882 INFO 12402 --- [restartedMain] n.b.p.u.AbstractUserAgentAnalyzerDirect : Building all needed matchers for the requested 11 fields. +2025-04-16 13:09:52.932 INFO 12402 --- [restartedMain] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor' +2025-04-16 13:09:53.017 INFO 12402 --- [restartedMain] org.quartz.impl.StdSchedulerFactory : Using default implementation for ThreadExecutor +2025-04-16 13:09:53.021 INFO 12402 --- [restartedMain] org.quartz.core.SchedulerSignalerImpl : Initialized Scheduler Signaller of type: class org.quartz.core.SchedulerSignalerImpl +2025-04-16 13:09:53.021 INFO 12402 --- [restartedMain] org.quartz.core.QuartzScheduler : Quartz Scheduler v.2.3.2 created. +2025-04-16 13:09:53.021 INFO 12402 --- [restartedMain] org.quartz.simpl.RAMJobStore : RAMJobStore initialized. +2025-04-16 13:09:53.022 INFO 12402 --- [restartedMain] org.quartz.core.QuartzScheduler : Scheduler meta-data: Quartz Scheduler (v2.3.2) 'quartzScheduler' with instanceId 'NON_CLUSTERED' + Scheduler class: 'org.quartz.core.QuartzScheduler' - running locally. + NOT STARTED. + Currently in standby mode. + Number of jobs executed: 0 + Using thread pool 'org.quartz.simpl.SimpleThreadPool' - with 10 threads. + Using job-store 'org.quartz.simpl.RAMJobStore' - which does not support persistence. and is not clustered. + +2025-04-16 13:09:53.022 INFO 12402 --- [restartedMain] org.quartz.impl.StdSchedulerFactory : Quartz scheduler 'quartzScheduler' initialized from an externally provided properties instance. +2025-04-16 13:09:53.022 INFO 12402 --- [restartedMain] org.quartz.impl.StdSchedulerFactory : Quartz scheduler version: 2.3.2 +2025-04-16 13:09:53.022 INFO 12402 --- [restartedMain] org.quartz.core.QuartzScheduler : JobFactory set to: org.springframework.scheduling.quartz.SpringBeanJobFactory@50277685 +2025-04-16 13:09:53.052 INFO 12402 --- [restartedMain] o.s.s.web.DefaultSecurityFilterChain : Creating filter chain: any request, [org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter@34ea1162, org.springframework.security.web.context.SecurityContextPersistenceFilter@395d721b, org.springframework.security.web.header.HeaderWriterFilter@3c9f06af, org.springframework.web.filter.CorsFilter@6a92fea6, org.springframework.security.web.authentication.logout.LogoutFilter@206067a0, com.mingchen.common.config.JwtLoginFilter@62fa9ea1, com.mingchen.common.config.JwtFilter@4257fa91, org.springframework.security.web.savedrequest.RequestCacheAwareFilter@752b27cb, org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter@18af3b9a, org.springframework.security.web.authentication.AnonymousAuthenticationFilter@265282b8, org.springframework.security.web.session.SessionManagementFilter@6b258905, org.springframework.security.web.access.ExceptionTranslationFilter@324708b8, org.springframework.security.web.access.intercept.FilterSecurityInterceptor@4e13861] +2025-04-16 13:09:53.068 INFO 12402 --- [restartedMain] o.s.b.d.a.OptionalLiveReloadServer : LiveReload server is running on port 35729 +2025-04-16 13:09:53.075 INFO 12402 --- [restartedMain] o.s.s.quartz.SchedulerFactoryBean : Starting Quartz Scheduler now +2025-04-16 13:09:53.076 INFO 12402 --- [restartedMain] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED started. +2025-04-16 13:09:53.085 INFO 12402 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 9092 (http) with context path '' +2025-04-16 13:09:53.087 INFO 12402 --- [restartedMain] com.mingchen.BlogApiApplication : Started BlogApiApplication in 1.351 seconds (JVM running for 1.587) +2025-04-16 13:10:00.218 INFO 12402 --- [http-nio-9092-exec-2] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet' +2025-04-16 13:10:00.218 INFO 12402 --- [http-nio-9092-exec-2] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet' +2025-04-16 13:10:00.221 INFO 12402 --- [http-nio-9092-exec-2] o.s.web.servlet.DispatcherServlet : Completed initialization in 3 ms +2025-04-16 13:10:21.978 INFO 12402 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED paused. +2025-04-16 13:10:21.980 INFO 12402 --- [SpringContextShutdownHook] o.s.s.quartz.SchedulerFactoryBean : Shutting down Quartz Scheduler +2025-04-16 13:10:21.980 INFO 12402 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED shutting down. +2025-04-16 13:10:21.980 INFO 12402 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED paused. +2025-04-16 13:10:21.980 INFO 12402 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED shutdown complete. +2025-04-16 13:10:21.980 INFO 12402 --- [SpringContextShutdownHook] o.s.s.concurrent.ThreadPoolTaskExecutor : Shutting down ExecutorService 'applicationTaskExecutor' +2025-04-16 13:10:21.996 ERROR 12402 --- [http-nio-9092-exec-2] org.thymeleaf.TemplateEngine : [THYMELEAF][http-nio-9092-exec-2] Exception processing template "admin/ai": Error resolving template [admin/ai], template might not exist or might not be accessible by any of the configured Template Resolvers + +org.thymeleaf.exceptions.TemplateInputException: Error resolving template [admin/ai], template might not exist or might not be accessible by any of the configured Template Resolvers + at org.thymeleaf.engine.TemplateManager.resolveTemplate(TemplateManager.java:869) + at org.thymeleaf.engine.TemplateManager.parseAndProcess(TemplateManager.java:607) + at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1098) + at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1072) + at org.thymeleaf.spring5.view.ThymeleafView.renderFragment(ThymeleafView.java:362) + at org.thymeleaf.spring5.view.ThymeleafView.render(ThymeleafView.java:189) + at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1373) + at org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1118) + at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1057) + at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943) + at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) + at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909) + at javax.servlet.http.HttpServlet.service(HttpServlet.java:523) + at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) + at javax.servlet.http.HttpServlet.service(HttpServlet.java:590) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:320) + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:126) + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:90) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:118) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:137) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:111) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:158) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at com.mingchen.common.config.JwtFilter.doFilter(JwtFilter.java:68) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:200) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:116) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:92) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:92) + at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:77) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:105) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:56) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:215) + at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:178) + at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:358) + at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:271) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202) + at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) + at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541) + at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139) + at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) + at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) + at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) + at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:373) + at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) + at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868) + at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1590) + at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) + at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) + at java.base/java.lang.Thread.run(Thread.java:840) + +2025-04-16 13:10:24.127 INFO 12412 --- [restartedMain] com.mingchen.BlogApiApplication : Starting BlogApiApplication on mingchendeMac-mini.local with PID 12412 (/Users/mingchen/code/java/other/legalAid/api/target/classes started by mingchen in /Users/mingchen/code/java/other/legalAid) +2025-04-16 13:10:24.128 DEBUG 12412 --- [restartedMain] com.mingchen.BlogApiApplication : Running with Spring Boot v2.2.7.RELEASE, Spring v5.2.6.RELEASE +2025-04-16 13:10:24.128 INFO 12412 --- [restartedMain] com.mingchen.BlogApiApplication : The following profiles are active: dev +2025-04-16 13:10:24.145 INFO 12412 --- [restartedMain] o.s.b.devtools.restart.ChangeableUrls : The Class-Path manifest attribute in /usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/jaxb-runtime-2.3.1.jar referenced one or more files that do not exist: file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/jaxb-api-2.3.1.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/txw2-2.3.1.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/istack-commons-runtime-3.0.7.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/stax-ex-1.8.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/FastInfoset-1.2.15.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/javax.activation-api-1.2.0.jar +2025-04-16 13:10:24.145 INFO 12412 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : Devtools property defaults active! Set 'spring.devtools.add-properties' to 'false' to disable +2025-04-16 13:10:24.145 INFO 12412 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : For additional web related logging consider setting the 'logging.level.web' property to 'DEBUG' +2025-04-16 13:10:24.335 INFO 12412 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Multiple Spring Data modules found, entering strict repository configuration mode! +2025-04-16 13:10:24.336 INFO 12412 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data Redis repositories in DEFAULT mode. +2025-04-16 13:10:24.345 INFO 12412 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 6ms. Found 0 Redis repository interfaces. +2025-04-16 13:10:24.576 INFO 12412 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 9092 (http) +2025-04-16 13:10:24.579 INFO 12412 --- [restartedMain] o.apache.catalina.core.StandardService : Starting service [Tomcat] +2025-04-16 13:10:24.580 INFO 12412 --- [restartedMain] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.34] +2025-04-16 13:10:24.601 INFO 12412 --- [restartedMain] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext +2025-04-16 13:10:24.602 INFO 12412 --- [restartedMain] o.s.web.context.ContextLoader : Root WebApplicationContext: initialization completed in 457 ms +2025-04-16 13:10:25.060 INFO 12412 --- [restartedMain] n.b.p.u.AbstractUserAgentAnalyzerDirect : - Loaded 90 files in 206 msec using expression: classpath*:UserAgents/**/*.yaml +2025-04-16 13:10:25.060 INFO 12412 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : +2025-04-16 13:10:25.060 INFO 12412 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : /-----------------------------------------------------------\ +2025-04-16 13:10:25.060 INFO 12412 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : | Yauaa 5.20 (v5.20 @ 2020-11-22T15:39:16Z) | +2025-04-16 13:10:25.060 INFO 12412 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : +-----------------------------------------------------------+ +2025-04-16 13:10:25.060 INFO 12412 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : | For more information: https://yauaa.basjes.nl | +2025-04-16 13:10:25.060 INFO 12412 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : | Copyright (C) 2013-2020 Niels Basjes - License Apache 2.0 | +2025-04-16 13:10:25.060 INFO 12412 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : \-----------------------------------------------------------/ +2025-04-16 13:10:25.060 INFO 12412 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : +2025-04-16 13:10:25.063 INFO 12412 --- [restartedMain] n.b.p.u.AbstractUserAgentAnalyzerDirect : Building all needed matchers for the requested 11 fields. +2025-04-16 13:10:25.108 INFO 12412 --- [restartedMain] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor' +2025-04-16 13:10:25.181 INFO 12412 --- [restartedMain] org.quartz.impl.StdSchedulerFactory : Using default implementation for ThreadExecutor +2025-04-16 13:10:25.185 INFO 12412 --- [restartedMain] org.quartz.core.SchedulerSignalerImpl : Initialized Scheduler Signaller of type: class org.quartz.core.SchedulerSignalerImpl +2025-04-16 13:10:25.185 INFO 12412 --- [restartedMain] org.quartz.core.QuartzScheduler : Quartz Scheduler v.2.3.2 created. +2025-04-16 13:10:25.185 INFO 12412 --- [restartedMain] org.quartz.simpl.RAMJobStore : RAMJobStore initialized. +2025-04-16 13:10:25.185 INFO 12412 --- [restartedMain] org.quartz.core.QuartzScheduler : Scheduler meta-data: Quartz Scheduler (v2.3.2) 'quartzScheduler' with instanceId 'NON_CLUSTERED' + Scheduler class: 'org.quartz.core.QuartzScheduler' - running locally. + NOT STARTED. + Currently in standby mode. + Number of jobs executed: 0 + Using thread pool 'org.quartz.simpl.SimpleThreadPool' - with 10 threads. + Using job-store 'org.quartz.simpl.RAMJobStore' - which does not support persistence. and is not clustered. + +2025-04-16 13:10:25.185 INFO 12412 --- [restartedMain] org.quartz.impl.StdSchedulerFactory : Quartz scheduler 'quartzScheduler' initialized from an externally provided properties instance. +2025-04-16 13:10:25.186 INFO 12412 --- [restartedMain] org.quartz.impl.StdSchedulerFactory : Quartz scheduler version: 2.3.2 +2025-04-16 13:10:25.186 INFO 12412 --- [restartedMain] org.quartz.core.QuartzScheduler : JobFactory set to: org.springframework.scheduling.quartz.SpringBeanJobFactory@747c331 +2025-04-16 13:10:25.214 INFO 12412 --- [restartedMain] o.s.s.web.DefaultSecurityFilterChain : Creating filter chain: any request, [org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter@3e7527fa, org.springframework.security.web.context.SecurityContextPersistenceFilter@120d32f8, org.springframework.security.web.header.HeaderWriterFilter@5909759d, org.springframework.web.filter.CorsFilter@7d4c7f04, org.springframework.security.web.authentication.logout.LogoutFilter@5122db3d, com.mingchen.common.config.JwtLoginFilter@70c31eb6, com.mingchen.common.config.JwtFilter@10c3995d, org.springframework.security.web.savedrequest.RequestCacheAwareFilter@52150136, org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter@28e5d68d, org.springframework.security.web.authentication.AnonymousAuthenticationFilter@79e3648, org.springframework.security.web.session.SessionManagementFilter@784e0754, org.springframework.security.web.access.ExceptionTranslationFilter@8147e5e, org.springframework.security.web.access.intercept.FilterSecurityInterceptor@348f6c1] +2025-04-16 13:10:25.225 INFO 12412 --- [restartedMain] o.s.b.d.a.OptionalLiveReloadServer : LiveReload server is running on port 35729 +2025-04-16 13:10:25.232 INFO 12412 --- [restartedMain] o.s.s.quartz.SchedulerFactoryBean : Starting Quartz Scheduler now +2025-04-16 13:10:25.232 INFO 12412 --- [restartedMain] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED started. +2025-04-16 13:10:25.241 INFO 12412 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 9092 (http) with context path '' +2025-04-16 13:10:25.243 INFO 12412 --- [restartedMain] com.mingchen.BlogApiApplication : Started BlogApiApplication in 1.289 seconds (JVM running for 1.527) +2025-04-16 13:10:30.439 INFO 12412 --- [http-nio-9092-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet' +2025-04-16 13:10:30.439 INFO 12412 --- [http-nio-9092-exec-1] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet' +2025-04-16 13:10:30.442 INFO 12412 --- [http-nio-9092-exec-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 3 ms +2025-04-16 13:11:50.634 ERROR 12412 --- [http-nio-9092-exec-1] org.thymeleaf.TemplateEngine : [THYMELEAF][http-nio-9092-exec-1] Exception processing template "admin/ai": Error resolving template [admin/ai], template might not exist or might not be accessible by any of the configured Template Resolvers + +org.thymeleaf.exceptions.TemplateInputException: Error resolving template [admin/ai], template might not exist or might not be accessible by any of the configured Template Resolvers + at org.thymeleaf.engine.TemplateManager.resolveTemplate(TemplateManager.java:869) + at org.thymeleaf.engine.TemplateManager.parseAndProcess(TemplateManager.java:607) + at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1098) + at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1072) + at org.thymeleaf.spring5.view.ThymeleafView.renderFragment(ThymeleafView.java:362) + at org.thymeleaf.spring5.view.ThymeleafView.render(ThymeleafView.java:189) + at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1373) + at org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1118) + at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1057) + at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943) + at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) + at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909) + at javax.servlet.http.HttpServlet.service(HttpServlet.java:523) + at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) + at javax.servlet.http.HttpServlet.service(HttpServlet.java:590) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:320) + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:126) + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:90) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:118) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:137) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:111) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:158) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at com.mingchen.common.config.JwtFilter.doFilter(JwtFilter.java:68) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:200) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:116) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:92) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:92) + at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:77) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:105) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:56) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:215) + at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:178) + at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:358) + at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:271) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202) + at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) + at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541) + at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139) + at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) + at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) + at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) + at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:373) + at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) + at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868) + at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1590) + at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) + at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) + at java.base/java.lang.Thread.run(Thread.java:840) + +2025-04-16 13:11:50.635 ERROR 12412 --- [http-nio-9092-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.thymeleaf.exceptions.TemplateInputException: Error resolving template [admin/ai], template might not exist or might not be accessible by any of the configured Template Resolvers] with root cause + +org.thymeleaf.exceptions.TemplateInputException: Error resolving template [admin/ai], template might not exist or might not be accessible by any of the configured Template Resolvers + at org.thymeleaf.engine.TemplateManager.resolveTemplate(TemplateManager.java:869) + at org.thymeleaf.engine.TemplateManager.parseAndProcess(TemplateManager.java:607) + at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1098) + at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1072) + at org.thymeleaf.spring5.view.ThymeleafView.renderFragment(ThymeleafView.java:362) + at org.thymeleaf.spring5.view.ThymeleafView.render(ThymeleafView.java:189) + at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1373) + at org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1118) + at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1057) + at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943) + at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) + at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909) + at javax.servlet.http.HttpServlet.service(HttpServlet.java:523) + at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) + at javax.servlet.http.HttpServlet.service(HttpServlet.java:590) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:320) + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:126) + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:90) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:118) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:137) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:111) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:158) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at com.mingchen.common.config.JwtFilter.doFilter(JwtFilter.java:68) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:200) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:116) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:92) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:92) + at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:77) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:105) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:56) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:215) + at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:178) + at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:358) + at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:271) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202) + at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) + at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541) + at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139) + at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) + at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) + at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) + at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:373) + at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) + at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868) + at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1590) + at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) + at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) + at java.base/java.lang.Thread.run(Thread.java:840) + +2025-04-16 13:13:59.903 ERROR 12412 --- [http-nio-9092-exec-5] org.thymeleaf.TemplateEngine : [THYMELEAF][http-nio-9092-exec-5] Exception processing template "admin/ai": Error resolving template [admin/ai], template might not exist or might not be accessible by any of the configured Template Resolvers + +org.thymeleaf.exceptions.TemplateInputException: Error resolving template [admin/ai], template might not exist or might not be accessible by any of the configured Template Resolvers + at org.thymeleaf.engine.TemplateManager.resolveTemplate(TemplateManager.java:869) + at org.thymeleaf.engine.TemplateManager.parseAndProcess(TemplateManager.java:607) + at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1098) + at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1072) + at org.thymeleaf.spring5.view.ThymeleafView.renderFragment(ThymeleafView.java:362) + at org.thymeleaf.spring5.view.ThymeleafView.render(ThymeleafView.java:189) + at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1373) + at org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1118) + at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1057) + at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943) + at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) + at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909) + at javax.servlet.http.HttpServlet.service(HttpServlet.java:523) + at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) + at javax.servlet.http.HttpServlet.service(HttpServlet.java:590) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:320) + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:126) + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:90) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:118) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:137) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:111) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:158) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at com.mingchen.common.config.JwtFilter.doFilter(JwtFilter.java:68) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:200) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:116) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:92) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:92) + at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:77) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:105) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:56) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:215) + at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:178) + at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:358) + at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:271) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202) + at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) + at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541) + at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139) + at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) + at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) + at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) + at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:373) + at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) + at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868) + at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1590) + at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) + at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) + at java.base/java.lang.Thread.run(Thread.java:840) + +2025-04-16 13:13:59.905 ERROR 12412 --- [http-nio-9092-exec-5] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.thymeleaf.exceptions.TemplateInputException: Error resolving template [admin/ai], template might not exist or might not be accessible by any of the configured Template Resolvers] with root cause + +org.thymeleaf.exceptions.TemplateInputException: Error resolving template [admin/ai], template might not exist or might not be accessible by any of the configured Template Resolvers + at org.thymeleaf.engine.TemplateManager.resolveTemplate(TemplateManager.java:869) + at org.thymeleaf.engine.TemplateManager.parseAndProcess(TemplateManager.java:607) + at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1098) + at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1072) + at org.thymeleaf.spring5.view.ThymeleafView.renderFragment(ThymeleafView.java:362) + at org.thymeleaf.spring5.view.ThymeleafView.render(ThymeleafView.java:189) + at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1373) + at org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1118) + at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1057) + at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943) + at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) + at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909) + at javax.servlet.http.HttpServlet.service(HttpServlet.java:523) + at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) + at javax.servlet.http.HttpServlet.service(HttpServlet.java:590) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:320) + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:126) + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:90) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:118) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:137) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:111) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:158) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at com.mingchen.common.config.JwtFilter.doFilter(JwtFilter.java:68) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:200) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:116) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:92) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:92) + at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:77) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:105) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:56) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:215) + at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:178) + at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:358) + at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:271) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202) + at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) + at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541) + at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139) + at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) + at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) + at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) + at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:373) + at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) + at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868) + at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1590) + at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) + at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) + at java.base/java.lang.Thread.run(Thread.java:840) + +2025-04-16 13:13:59.957 INFO 12412 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED paused. +2025-04-16 13:13:59.959 INFO 12412 --- [SpringContextShutdownHook] o.s.s.quartz.SchedulerFactoryBean : Shutting down Quartz Scheduler +2025-04-16 13:13:59.959 INFO 12412 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED shutting down. +2025-04-16 13:13:59.959 INFO 12412 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED paused. +2025-04-16 13:13:59.959 INFO 12412 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED shutdown complete. +2025-04-16 13:13:59.960 INFO 12412 --- [SpringContextShutdownHook] o.s.s.concurrent.ThreadPoolTaskExecutor : Shutting down ExecutorService 'applicationTaskExecutor' +2025-04-16 13:14:02.302 INFO 12457 --- [restartedMain] com.mingchen.BlogApiApplication : Starting BlogApiApplication on mingchendeMac-mini.local with PID 12457 (/Users/mingchen/code/java/other/legalAid/api/target/classes started by mingchen in /Users/mingchen/code/java/other/legalAid) +2025-04-16 13:14:02.304 DEBUG 12457 --- [restartedMain] com.mingchen.BlogApiApplication : Running with Spring Boot v2.2.7.RELEASE, Spring v5.2.6.RELEASE +2025-04-16 13:14:02.304 INFO 12457 --- [restartedMain] com.mingchen.BlogApiApplication : The following profiles are active: dev +2025-04-16 13:14:02.327 INFO 12457 --- [restartedMain] o.s.b.devtools.restart.ChangeableUrls : The Class-Path manifest attribute in /usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/jaxb-runtime-2.3.1.jar referenced one or more files that do not exist: file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/jaxb-api-2.3.1.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/txw2-2.3.1.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/istack-commons-runtime-3.0.7.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/stax-ex-1.8.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/FastInfoset-1.2.15.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/javax.activation-api-1.2.0.jar +2025-04-16 13:14:02.327 INFO 12457 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : Devtools property defaults active! Set 'spring.devtools.add-properties' to 'false' to disable +2025-04-16 13:14:02.327 INFO 12457 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : For additional web related logging consider setting the 'logging.level.web' property to 'DEBUG' +2025-04-16 13:14:02.551 INFO 12457 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Multiple Spring Data modules found, entering strict repository configuration mode! +2025-04-16 13:14:02.551 INFO 12457 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data Redis repositories in DEFAULT mode. +2025-04-16 13:14:02.565 INFO 12457 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 8ms. Found 0 Redis repository interfaces. +2025-04-16 13:14:02.824 INFO 12457 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 9092 (http) +2025-04-16 13:14:02.827 INFO 12457 --- [restartedMain] o.apache.catalina.core.StandardService : Starting service [Tomcat] +2025-04-16 13:14:02.827 INFO 12457 --- [restartedMain] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.34] +2025-04-16 13:14:02.851 INFO 12457 --- [restartedMain] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext +2025-04-16 13:14:02.852 INFO 12457 --- [restartedMain] o.s.web.context.ContextLoader : Root WebApplicationContext: initialization completed in 525 ms +2025-04-16 13:14:03.315 INFO 12457 --- [restartedMain] n.b.p.u.AbstractUserAgentAnalyzerDirect : - Loaded 90 files in 208 msec using expression: classpath*:UserAgents/**/*.yaml +2025-04-16 13:14:03.315 INFO 12457 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : +2025-04-16 13:14:03.316 INFO 12457 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : /-----------------------------------------------------------\ +2025-04-16 13:14:03.316 INFO 12457 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : | Yauaa 5.20 (v5.20 @ 2020-11-22T15:39:16Z) | +2025-04-16 13:14:03.316 INFO 12457 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : +-----------------------------------------------------------+ +2025-04-16 13:14:03.316 INFO 12457 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : | For more information: https://yauaa.basjes.nl | +2025-04-16 13:14:03.316 INFO 12457 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : | Copyright (C) 2013-2020 Niels Basjes - License Apache 2.0 | +2025-04-16 13:14:03.316 INFO 12457 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : \-----------------------------------------------------------/ +2025-04-16 13:14:03.316 INFO 12457 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : +2025-04-16 13:14:03.319 INFO 12457 --- [restartedMain] n.b.p.u.AbstractUserAgentAnalyzerDirect : Building all needed matchers for the requested 11 fields. +2025-04-16 13:14:03.368 INFO 12457 --- [restartedMain] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor' +2025-04-16 13:14:03.452 INFO 12457 --- [restartedMain] org.quartz.impl.StdSchedulerFactory : Using default implementation for ThreadExecutor +2025-04-16 13:14:03.456 INFO 12457 --- [restartedMain] org.quartz.core.SchedulerSignalerImpl : Initialized Scheduler Signaller of type: class org.quartz.core.SchedulerSignalerImpl +2025-04-16 13:14:03.456 INFO 12457 --- [restartedMain] org.quartz.core.QuartzScheduler : Quartz Scheduler v.2.3.2 created. +2025-04-16 13:14:03.456 INFO 12457 --- [restartedMain] org.quartz.simpl.RAMJobStore : RAMJobStore initialized. +2025-04-16 13:14:03.456 INFO 12457 --- [restartedMain] org.quartz.core.QuartzScheduler : Scheduler meta-data: Quartz Scheduler (v2.3.2) 'quartzScheduler' with instanceId 'NON_CLUSTERED' + Scheduler class: 'org.quartz.core.QuartzScheduler' - running locally. + NOT STARTED. + Currently in standby mode. + Number of jobs executed: 0 + Using thread pool 'org.quartz.simpl.SimpleThreadPool' - with 10 threads. + Using job-store 'org.quartz.simpl.RAMJobStore' - which does not support persistence. and is not clustered. + +2025-04-16 13:14:03.456 INFO 12457 --- [restartedMain] org.quartz.impl.StdSchedulerFactory : Quartz scheduler 'quartzScheduler' initialized from an externally provided properties instance. +2025-04-16 13:14:03.456 INFO 12457 --- [restartedMain] org.quartz.impl.StdSchedulerFactory : Quartz scheduler version: 2.3.2 +2025-04-16 13:14:03.456 INFO 12457 --- [restartedMain] org.quartz.core.QuartzScheduler : JobFactory set to: org.springframework.scheduling.quartz.SpringBeanJobFactory@519ef6d5 +2025-04-16 13:14:03.487 INFO 12457 --- [restartedMain] o.s.s.web.DefaultSecurityFilterChain : Creating filter chain: any request, [org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter@6fc8fdb4, org.springframework.security.web.context.SecurityContextPersistenceFilter@7cc6ef66, org.springframework.security.web.header.HeaderWriterFilter@70a82c37, org.springframework.web.filter.CorsFilter@6f719fe9, org.springframework.security.web.authentication.logout.LogoutFilter@65d33011, com.mingchen.common.config.JwtLoginFilter@10021761, com.mingchen.common.config.JwtFilter@48ffc7a8, org.springframework.security.web.savedrequest.RequestCacheAwareFilter@56a78aff, org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter@4fcb2387, org.springframework.security.web.authentication.AnonymousAuthenticationFilter@60f2a65e, org.springframework.security.web.session.SessionManagementFilter@4f8a49a, org.springframework.security.web.access.ExceptionTranslationFilter@16d69cb4, org.springframework.security.web.access.intercept.FilterSecurityInterceptor@2f126cb5] +2025-04-16 13:14:03.497 INFO 12457 --- [restartedMain] o.s.b.d.a.OptionalLiveReloadServer : LiveReload server is running on port 35729 +2025-04-16 13:14:03.505 INFO 12457 --- [restartedMain] o.s.s.quartz.SchedulerFactoryBean : Starting Quartz Scheduler now +2025-04-16 13:14:03.505 INFO 12457 --- [restartedMain] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED started. +2025-04-16 13:14:03.513 INFO 12457 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 9092 (http) with context path '' +2025-04-16 13:14:03.515 INFO 12457 --- [restartedMain] com.mingchen.BlogApiApplication : Started BlogApiApplication in 1.379 seconds (JVM running for 1.654) +2025-04-16 13:14:06.625 INFO 12457 --- [http-nio-9092-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet' +2025-04-16 13:14:06.625 INFO 12457 --- [http-nio-9092-exec-1] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet' +2025-04-16 13:14:06.627 INFO 12457 --- [http-nio-9092-exec-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 2 ms +2025-04-16 13:14:35.152 ERROR 12457 --- [http-nio-9092-exec-1] org.thymeleaf.TemplateEngine : [THYMELEAF][http-nio-9092-exec-1] Exception processing template "admin/ai": Error resolving template [admin/ai], template might not exist or might not be accessible by any of the configured Template Resolvers + +org.thymeleaf.exceptions.TemplateInputException: Error resolving template [admin/ai], template might not exist or might not be accessible by any of the configured Template Resolvers + at org.thymeleaf.engine.TemplateManager.resolveTemplate(TemplateManager.java:869) + at org.thymeleaf.engine.TemplateManager.parseAndProcess(TemplateManager.java:607) + at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1098) + at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1072) + at org.thymeleaf.spring5.view.ThymeleafView.renderFragment(ThymeleafView.java:362) + at org.thymeleaf.spring5.view.ThymeleafView.render(ThymeleafView.java:189) + at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1373) + at org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1118) + at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1057) + at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943) + at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) + at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909) + at javax.servlet.http.HttpServlet.service(HttpServlet.java:523) + at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) + at javax.servlet.http.HttpServlet.service(HttpServlet.java:590) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:320) + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:126) + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:90) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:118) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:137) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:111) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:158) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at com.mingchen.common.config.JwtFilter.doFilter(JwtFilter.java:68) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:200) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:116) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:92) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:92) + at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:77) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:105) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:56) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:215) + at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:178) + at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:358) + at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:271) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202) + at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) + at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541) + at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139) + at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) + at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) + at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) + at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:373) + at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) + at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868) + at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1590) + at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) + at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) + at java.base/java.lang.Thread.run(Thread.java:840) + +2025-04-16 13:14:35.153 ERROR 12457 --- [http-nio-9092-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.thymeleaf.exceptions.TemplateInputException: Error resolving template [admin/ai], template might not exist or might not be accessible by any of the configured Template Resolvers] with root cause + +org.thymeleaf.exceptions.TemplateInputException: Error resolving template [admin/ai], template might not exist or might not be accessible by any of the configured Template Resolvers + at org.thymeleaf.engine.TemplateManager.resolveTemplate(TemplateManager.java:869) + at org.thymeleaf.engine.TemplateManager.parseAndProcess(TemplateManager.java:607) + at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1098) + at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1072) + at org.thymeleaf.spring5.view.ThymeleafView.renderFragment(ThymeleafView.java:362) + at org.thymeleaf.spring5.view.ThymeleafView.render(ThymeleafView.java:189) + at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1373) + at org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1118) + at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1057) + at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943) + at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) + at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909) + at javax.servlet.http.HttpServlet.service(HttpServlet.java:523) + at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) + at javax.servlet.http.HttpServlet.service(HttpServlet.java:590) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:320) + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:126) + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:90) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:118) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:137) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:111) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:158) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at com.mingchen.common.config.JwtFilter.doFilter(JwtFilter.java:68) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:200) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:116) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:92) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:92) + at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:77) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:105) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:56) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:215) + at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:178) + at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:358) + at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:271) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202) + at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) + at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541) + at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139) + at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) + at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) + at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) + at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:373) + at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) + at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868) + at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1590) + at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) + at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) + at java.base/java.lang.Thread.run(Thread.java:840) + +2025-04-16 13:15:30.274 ERROR 12457 --- [http-nio-9092-exec-4] org.thymeleaf.TemplateEngine : [THYMELEAF][http-nio-9092-exec-4] Exception processing template "admin/ai": Error resolving template [admin/ai], template might not exist or might not be accessible by any of the configured Template Resolvers + +org.thymeleaf.exceptions.TemplateInputException: Error resolving template [admin/ai], template might not exist or might not be accessible by any of the configured Template Resolvers + at org.thymeleaf.engine.TemplateManager.resolveTemplate(TemplateManager.java:869) + at org.thymeleaf.engine.TemplateManager.parseAndProcess(TemplateManager.java:607) + at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1098) + at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1072) + at org.thymeleaf.spring5.view.ThymeleafView.renderFragment(ThymeleafView.java:362) + at org.thymeleaf.spring5.view.ThymeleafView.render(ThymeleafView.java:189) + at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1373) + at org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1118) + at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1057) + at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943) + at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) + at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909) + at javax.servlet.http.HttpServlet.service(HttpServlet.java:523) + at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) + at javax.servlet.http.HttpServlet.service(HttpServlet.java:590) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:320) + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:126) + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:90) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:118) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:137) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:111) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:158) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at com.mingchen.common.config.JwtFilter.doFilter(JwtFilter.java:68) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:200) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:116) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:92) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:92) + at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:77) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:105) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:56) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:215) + at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:178) + at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:358) + at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:271) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202) + at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) + at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541) + at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139) + at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) + at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) + at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) + at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:373) + at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) + at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868) + at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1590) + at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) + at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) + at java.base/java.lang.Thread.run(Thread.java:840) + +2025-04-16 13:15:30.275 ERROR 12457 --- [http-nio-9092-exec-4] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.thymeleaf.exceptions.TemplateInputException: Error resolving template [admin/ai], template might not exist or might not be accessible by any of the configured Template Resolvers] with root cause + +org.thymeleaf.exceptions.TemplateInputException: Error resolving template [admin/ai], template might not exist or might not be accessible by any of the configured Template Resolvers + at org.thymeleaf.engine.TemplateManager.resolveTemplate(TemplateManager.java:869) + at org.thymeleaf.engine.TemplateManager.parseAndProcess(TemplateManager.java:607) + at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1098) + at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1072) + at org.thymeleaf.spring5.view.ThymeleafView.renderFragment(ThymeleafView.java:362) + at org.thymeleaf.spring5.view.ThymeleafView.render(ThymeleafView.java:189) + at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1373) + at org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1118) + at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1057) + at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943) + at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) + at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909) + at javax.servlet.http.HttpServlet.service(HttpServlet.java:523) + at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) + at javax.servlet.http.HttpServlet.service(HttpServlet.java:590) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:320) + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:126) + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:90) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:118) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:137) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:111) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:158) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at com.mingchen.common.config.JwtFilter.doFilter(JwtFilter.java:68) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:200) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:116) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:92) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:92) + at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:77) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:105) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:56) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:215) + at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:178) + at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:358) + at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:271) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202) + at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) + at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541) + at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139) + at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) + at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) + at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) + at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:373) + at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) + at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868) + at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1590) + at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) + at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) + at java.base/java.lang.Thread.run(Thread.java:840) + +2025-04-16 13:15:35.293 INFO 12457 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED paused. +2025-04-16 13:15:35.294 INFO 12457 --- [SpringContextShutdownHook] o.s.s.quartz.SchedulerFactoryBean : Shutting down Quartz Scheduler +2025-04-16 13:15:35.294 INFO 12457 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED shutting down. +2025-04-16 13:15:35.294 INFO 12457 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED paused. +2025-04-16 13:15:35.295 INFO 12457 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED shutdown complete. +2025-04-16 13:15:35.295 INFO 12457 --- [SpringContextShutdownHook] o.s.s.concurrent.ThreadPoolTaskExecutor : Shutting down ExecutorService 'applicationTaskExecutor' +2025-04-16 13:15:53.040 INFO 12489 --- [restartedMain] com.mingchen.BlogApiApplication : Starting BlogApiApplication on mingchendeMac-mini.local with PID 12489 (/Users/mingchen/code/java/other/legalAid/api/target/classes started by mingchen in /Users/mingchen/code/java/other/legalAid) +2025-04-16 13:15:53.041 DEBUG 12489 --- [restartedMain] com.mingchen.BlogApiApplication : Running with Spring Boot v2.2.7.RELEASE, Spring v5.2.6.RELEASE +2025-04-16 13:15:53.041 INFO 12489 --- [restartedMain] com.mingchen.BlogApiApplication : The following profiles are active: dev +2025-04-16 13:15:53.057 INFO 12489 --- [restartedMain] o.s.b.devtools.restart.ChangeableUrls : The Class-Path manifest attribute in /usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/jaxb-runtime-2.3.1.jar referenced one or more files that do not exist: file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/jaxb-api-2.3.1.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/txw2-2.3.1.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/istack-commons-runtime-3.0.7.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/stax-ex-1.8.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/FastInfoset-1.2.15.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/javax.activation-api-1.2.0.jar +2025-04-16 13:15:53.058 INFO 12489 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : Devtools property defaults active! Set 'spring.devtools.add-properties' to 'false' to disable +2025-04-16 13:15:53.058 INFO 12489 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : For additional web related logging consider setting the 'logging.level.web' property to 'DEBUG' +2025-04-16 13:15:53.259 INFO 12489 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Multiple Spring Data modules found, entering strict repository configuration mode! +2025-04-16 13:15:53.260 INFO 12489 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data Redis repositories in DEFAULT mode. +2025-04-16 13:15:53.272 INFO 12489 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 7ms. Found 0 Redis repository interfaces. +2025-04-16 13:15:53.529 INFO 12489 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 9092 (http) +2025-04-16 13:15:53.532 INFO 12489 --- [restartedMain] o.apache.catalina.core.StandardService : Starting service [Tomcat] +2025-04-16 13:15:53.533 INFO 12489 --- [restartedMain] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.34] +2025-04-16 13:15:53.555 INFO 12489 --- [restartedMain] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext +2025-04-16 13:15:53.556 INFO 12489 --- [restartedMain] o.s.web.context.ContextLoader : Root WebApplicationContext: initialization completed in 498 ms +2025-04-16 13:15:54.018 INFO 12489 --- [restartedMain] n.b.p.u.AbstractUserAgentAnalyzerDirect : - Loaded 90 files in 203 msec using expression: classpath*:UserAgents/**/*.yaml +2025-04-16 13:15:54.018 INFO 12489 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : +2025-04-16 13:15:54.019 INFO 12489 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : /-----------------------------------------------------------\ +2025-04-16 13:15:54.019 INFO 12489 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : | Yauaa 5.20 (v5.20 @ 2020-11-22T15:39:16Z) | +2025-04-16 13:15:54.019 INFO 12489 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : +-----------------------------------------------------------+ +2025-04-16 13:15:54.019 INFO 12489 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : | For more information: https://yauaa.basjes.nl | +2025-04-16 13:15:54.019 INFO 12489 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : | Copyright (C) 2013-2020 Niels Basjes - License Apache 2.0 | +2025-04-16 13:15:54.019 INFO 12489 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : \-----------------------------------------------------------/ +2025-04-16 13:15:54.019 INFO 12489 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : +2025-04-16 13:15:54.023 INFO 12489 --- [restartedMain] n.b.p.u.AbstractUserAgentAnalyzerDirect : Building all needed matchers for the requested 11 fields. +2025-04-16 13:15:54.070 INFO 12489 --- [restartedMain] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor' +2025-04-16 13:15:54.151 INFO 12489 --- [restartedMain] org.quartz.impl.StdSchedulerFactory : Using default implementation for ThreadExecutor +2025-04-16 13:15:54.155 INFO 12489 --- [restartedMain] org.quartz.core.SchedulerSignalerImpl : Initialized Scheduler Signaller of type: class org.quartz.core.SchedulerSignalerImpl +2025-04-16 13:15:54.155 INFO 12489 --- [restartedMain] org.quartz.core.QuartzScheduler : Quartz Scheduler v.2.3.2 created. +2025-04-16 13:15:54.155 INFO 12489 --- [restartedMain] org.quartz.simpl.RAMJobStore : RAMJobStore initialized. +2025-04-16 13:15:54.155 INFO 12489 --- [restartedMain] org.quartz.core.QuartzScheduler : Scheduler meta-data: Quartz Scheduler (v2.3.2) 'quartzScheduler' with instanceId 'NON_CLUSTERED' + Scheduler class: 'org.quartz.core.QuartzScheduler' - running locally. + NOT STARTED. + Currently in standby mode. + Number of jobs executed: 0 + Using thread pool 'org.quartz.simpl.SimpleThreadPool' - with 10 threads. + Using job-store 'org.quartz.simpl.RAMJobStore' - which does not support persistence. and is not clustered. + +2025-04-16 13:15:54.155 INFO 12489 --- [restartedMain] org.quartz.impl.StdSchedulerFactory : Quartz scheduler 'quartzScheduler' initialized from an externally provided properties instance. +2025-04-16 13:15:54.155 INFO 12489 --- [restartedMain] org.quartz.impl.StdSchedulerFactory : Quartz scheduler version: 2.3.2 +2025-04-16 13:15:54.155 INFO 12489 --- [restartedMain] org.quartz.core.QuartzScheduler : JobFactory set to: org.springframework.scheduling.quartz.SpringBeanJobFactory@3e83eb36 +2025-04-16 13:15:54.186 INFO 12489 --- [restartedMain] o.s.s.web.DefaultSecurityFilterChain : Creating filter chain: any request, [org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter@5e160d3c, org.springframework.security.web.context.SecurityContextPersistenceFilter@7800e8fa, org.springframework.security.web.header.HeaderWriterFilter@47a407a2, org.springframework.web.filter.CorsFilter@4024f771, org.springframework.security.web.authentication.logout.LogoutFilter@7a487a71, com.mingchen.common.config.JwtLoginFilter@5444c0d7, com.mingchen.common.config.JwtFilter@7cde1698, org.springframework.security.web.savedrequest.RequestCacheAwareFilter@27696c9f, org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter@165d3aa2, org.springframework.security.web.authentication.AnonymousAuthenticationFilter@124f9bd2, org.springframework.security.web.session.SessionManagementFilter@3fe51fe6, org.springframework.security.web.access.ExceptionTranslationFilter@6b1aa91a, org.springframework.security.web.access.intercept.FilterSecurityInterceptor@3eedec6f] +2025-04-16 13:15:54.197 INFO 12489 --- [restartedMain] o.s.b.d.a.OptionalLiveReloadServer : LiveReload server is running on port 35729 +2025-04-16 13:15:54.204 INFO 12489 --- [restartedMain] o.s.s.quartz.SchedulerFactoryBean : Starting Quartz Scheduler now +2025-04-16 13:15:54.204 INFO 12489 --- [restartedMain] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED started. +2025-04-16 13:15:54.213 INFO 12489 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 9092 (http) with context path '' +2025-04-16 13:15:54.214 INFO 12489 --- [restartedMain] com.mingchen.BlogApiApplication : Started BlogApiApplication in 1.332 seconds (JVM running for 1.599) +2025-04-16 13:15:56.638 INFO 12489 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED paused. +2025-04-16 13:15:56.640 INFO 12489 --- [SpringContextShutdownHook] o.s.s.quartz.SchedulerFactoryBean : Shutting down Quartz Scheduler +2025-04-16 13:15:56.640 INFO 12489 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED shutting down. +2025-04-16 13:15:56.640 INFO 12489 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED paused. +2025-04-16 13:15:56.640 INFO 12489 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED shutdown complete. +2025-04-16 13:15:56.640 INFO 12489 --- [SpringContextShutdownHook] o.s.s.concurrent.ThreadPoolTaskExecutor : Shutting down ExecutorService 'applicationTaskExecutor' +2025-04-16 13:16:01.056 INFO 12497 --- [restartedMain] com.mingchen.BlogApiApplication : Starting BlogApiApplication on mingchendeMac-mini.local with PID 12497 (/Users/mingchen/code/java/other/legalAid/api/target/classes started by mingchen in /Users/mingchen/code/java/other/legalAid) +2025-04-16 13:16:01.057 DEBUG 12497 --- [restartedMain] com.mingchen.BlogApiApplication : Running with Spring Boot v2.2.7.RELEASE, Spring v5.2.6.RELEASE +2025-04-16 13:16:01.057 INFO 12497 --- [restartedMain] com.mingchen.BlogApiApplication : The following profiles are active: dev +2025-04-16 13:16:01.072 INFO 12497 --- [restartedMain] o.s.b.devtools.restart.ChangeableUrls : The Class-Path manifest attribute in /usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/jaxb-runtime-2.3.1.jar referenced one or more files that do not exist: file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/jaxb-api-2.3.1.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/txw2-2.3.1.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/istack-commons-runtime-3.0.7.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/stax-ex-1.8.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/FastInfoset-1.2.15.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/javax.activation-api-1.2.0.jar +2025-04-16 13:16:01.072 INFO 12497 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : Devtools property defaults active! Set 'spring.devtools.add-properties' to 'false' to disable +2025-04-16 13:16:01.072 INFO 12497 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : For additional web related logging consider setting the 'logging.level.web' property to 'DEBUG' +2025-04-16 13:16:01.274 INFO 12497 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Multiple Spring Data modules found, entering strict repository configuration mode! +2025-04-16 13:16:01.275 INFO 12497 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data Redis repositories in DEFAULT mode. +2025-04-16 13:16:01.288 INFO 12497 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 7ms. Found 0 Redis repository interfaces. +2025-04-16 13:16:01.557 INFO 12497 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 9092 (http) +2025-04-16 13:16:01.561 INFO 12497 --- [restartedMain] o.apache.catalina.core.StandardService : Starting service [Tomcat] +2025-04-16 13:16:01.561 INFO 12497 --- [restartedMain] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.34] +2025-04-16 13:16:01.586 INFO 12497 --- [restartedMain] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext +2025-04-16 13:16:01.586 INFO 12497 --- [restartedMain] o.s.web.context.ContextLoader : Root WebApplicationContext: initialization completed in 513 ms +2025-04-16 13:16:02.081 INFO 12497 --- [restartedMain] n.b.p.u.AbstractUserAgentAnalyzerDirect : - Loaded 90 files in 213 msec using expression: classpath*:UserAgents/**/*.yaml +2025-04-16 13:16:02.081 INFO 12497 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : +2025-04-16 13:16:02.081 INFO 12497 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : /-----------------------------------------------------------\ +2025-04-16 13:16:02.081 INFO 12497 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : | Yauaa 5.20 (v5.20 @ 2020-11-22T15:39:16Z) | +2025-04-16 13:16:02.081 INFO 12497 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : +-----------------------------------------------------------+ +2025-04-16 13:16:02.081 INFO 12497 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : | For more information: https://yauaa.basjes.nl | +2025-04-16 13:16:02.081 INFO 12497 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : | Copyright (C) 2013-2020 Niels Basjes - License Apache 2.0 | +2025-04-16 13:16:02.081 INFO 12497 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : \-----------------------------------------------------------/ +2025-04-16 13:16:02.081 INFO 12497 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : +2025-04-16 13:16:02.084 INFO 12497 --- [restartedMain] n.b.p.u.AbstractUserAgentAnalyzerDirect : Building all needed matchers for the requested 11 fields. +2025-04-16 13:16:02.135 INFO 12497 --- [restartedMain] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor' +2025-04-16 13:16:02.214 INFO 12497 --- [restartedMain] org.quartz.impl.StdSchedulerFactory : Using default implementation for ThreadExecutor +2025-04-16 13:16:02.218 INFO 12497 --- [restartedMain] org.quartz.core.SchedulerSignalerImpl : Initialized Scheduler Signaller of type: class org.quartz.core.SchedulerSignalerImpl +2025-04-16 13:16:02.222 INFO 12497 --- [restartedMain] org.quartz.core.QuartzScheduler : Quartz Scheduler v.2.3.2 created. +2025-04-16 13:16:02.222 INFO 12497 --- [restartedMain] org.quartz.simpl.RAMJobStore : RAMJobStore initialized. +2025-04-16 13:16:02.222 INFO 12497 --- [restartedMain] org.quartz.core.QuartzScheduler : Scheduler meta-data: Quartz Scheduler (v2.3.2) 'quartzScheduler' with instanceId 'NON_CLUSTERED' + Scheduler class: 'org.quartz.core.QuartzScheduler' - running locally. + NOT STARTED. + Currently in standby mode. + Number of jobs executed: 0 + Using thread pool 'org.quartz.simpl.SimpleThreadPool' - with 10 threads. + Using job-store 'org.quartz.simpl.RAMJobStore' - which does not support persistence. and is not clustered. + +2025-04-16 13:16:02.222 INFO 12497 --- [restartedMain] org.quartz.impl.StdSchedulerFactory : Quartz scheduler 'quartzScheduler' initialized from an externally provided properties instance. +2025-04-16 13:16:02.222 INFO 12497 --- [restartedMain] org.quartz.impl.StdSchedulerFactory : Quartz scheduler version: 2.3.2 +2025-04-16 13:16:02.222 INFO 12497 --- [restartedMain] org.quartz.core.QuartzScheduler : JobFactory set to: org.springframework.scheduling.quartz.SpringBeanJobFactory@3d88ed7e +2025-04-16 13:16:02.253 INFO 12497 --- [restartedMain] o.s.s.web.DefaultSecurityFilterChain : Creating filter chain: any request, [org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter@709c63cf, org.springframework.security.web.context.SecurityContextPersistenceFilter@6388a6e2, org.springframework.security.web.header.HeaderWriterFilter@36a3fedb, org.springframework.web.filter.CorsFilter@3fb822ad, org.springframework.security.web.authentication.logout.LogoutFilter@310fe630, com.mingchen.common.config.JwtLoginFilter@737c494a, com.mingchen.common.config.JwtFilter@51d23080, org.springframework.security.web.savedrequest.RequestCacheAwareFilter@78c57b34, org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter@694c5284, org.springframework.security.web.authentication.AnonymousAuthenticationFilter@42c3a36e, org.springframework.security.web.session.SessionManagementFilter@218d5782, org.springframework.security.web.access.ExceptionTranslationFilter@39c845f6, org.springframework.security.web.access.intercept.FilterSecurityInterceptor@78bb5e7c] +2025-04-16 13:16:02.264 INFO 12497 --- [restartedMain] o.s.b.d.a.OptionalLiveReloadServer : LiveReload server is running on port 35729 +2025-04-16 13:16:02.271 INFO 12497 --- [restartedMain] o.s.s.quartz.SchedulerFactoryBean : Starting Quartz Scheduler now +2025-04-16 13:16:02.271 INFO 12497 --- [restartedMain] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED started. +2025-04-16 13:16:02.279 INFO 12497 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 9092 (http) with context path '' +2025-04-16 13:16:02.281 INFO 12497 --- [restartedMain] com.mingchen.BlogApiApplication : Started BlogApiApplication in 1.365 seconds (JVM running for 1.611) +2025-04-16 13:16:07.987 INFO 12497 --- [http-nio-9092-exec-2] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet' +2025-04-16 13:16:07.987 INFO 12497 --- [http-nio-9092-exec-2] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet' +2025-04-16 13:16:07.989 INFO 12497 --- [http-nio-9092-exec-2] o.s.web.servlet.DispatcherServlet : Completed initialization in 2 ms +2025-04-16 13:18:10.862 ERROR 12497 --- [http-nio-9092-exec-2] org.thymeleaf.TemplateEngine : [THYMELEAF][http-nio-9092-exec-2] Exception processing template "admin/ai": Error resolving template [admin/ai], template might not exist or might not be accessible by any of the configured Template Resolvers + +org.thymeleaf.exceptions.TemplateInputException: Error resolving template [admin/ai], template might not exist or might not be accessible by any of the configured Template Resolvers + at org.thymeleaf.engine.TemplateManager.resolveTemplate(TemplateManager.java:869) + at org.thymeleaf.engine.TemplateManager.parseAndProcess(TemplateManager.java:607) + at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1098) + at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1072) + at org.thymeleaf.spring5.view.ThymeleafView.renderFragment(ThymeleafView.java:362) + at org.thymeleaf.spring5.view.ThymeleafView.render(ThymeleafView.java:189) + at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1373) + at org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1118) + at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1057) + at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943) + at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) + at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909) + at javax.servlet.http.HttpServlet.service(HttpServlet.java:523) + at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) + at javax.servlet.http.HttpServlet.service(HttpServlet.java:590) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:320) + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:126) + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:90) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:118) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:137) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:111) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:158) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at com.mingchen.common.config.JwtFilter.doFilter(JwtFilter.java:68) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:200) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:116) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:92) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:92) + at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:77) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:105) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:56) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:215) + at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:178) + at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:358) + at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:271) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202) + at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) + at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541) + at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139) + at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) + at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) + at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) + at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:373) + at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) + at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868) + at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1590) + at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) + at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) + at java.base/java.lang.Thread.run(Thread.java:840) + +2025-04-16 13:18:10.863 ERROR 12497 --- [http-nio-9092-exec-2] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.thymeleaf.exceptions.TemplateInputException: Error resolving template [admin/ai], template might not exist or might not be accessible by any of the configured Template Resolvers] with root cause + +org.thymeleaf.exceptions.TemplateInputException: Error resolving template [admin/ai], template might not exist or might not be accessible by any of the configured Template Resolvers + at org.thymeleaf.engine.TemplateManager.resolveTemplate(TemplateManager.java:869) + at org.thymeleaf.engine.TemplateManager.parseAndProcess(TemplateManager.java:607) + at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1098) + at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1072) + at org.thymeleaf.spring5.view.ThymeleafView.renderFragment(ThymeleafView.java:362) + at org.thymeleaf.spring5.view.ThymeleafView.render(ThymeleafView.java:189) + at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1373) + at org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1118) + at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1057) + at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943) + at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) + at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909) + at javax.servlet.http.HttpServlet.service(HttpServlet.java:523) + at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) + at javax.servlet.http.HttpServlet.service(HttpServlet.java:590) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:320) + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:126) + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:90) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:118) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:137) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:111) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:158) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at com.mingchen.common.config.JwtFilter.doFilter(JwtFilter.java:68) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:200) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:116) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:92) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:92) + at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:77) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:105) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:56) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:215) + at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:178) + at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:358) + at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:271) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202) + at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) + at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541) + at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139) + at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) + at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) + at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) + at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:373) + at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) + at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868) + at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1590) + at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) + at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) + at java.base/java.lang.Thread.run(Thread.java:840) + +2025-04-16 13:18:40.515 INFO 12497 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED paused. +2025-04-16 13:18:40.516 INFO 12497 --- [SpringContextShutdownHook] o.s.s.quartz.SchedulerFactoryBean : Shutting down Quartz Scheduler +2025-04-16 13:18:40.516 INFO 12497 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED shutting down. +2025-04-16 13:18:40.516 INFO 12497 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED paused. +2025-04-16 13:18:40.517 INFO 12497 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED shutdown complete. +2025-04-16 13:18:40.517 INFO 12497 --- [SpringContextShutdownHook] o.s.s.concurrent.ThreadPoolTaskExecutor : Shutting down ExecutorService 'applicationTaskExecutor' +2025-04-16 13:18:42.563 INFO 12532 --- [restartedMain] com.mingchen.BlogApiApplication : Starting BlogApiApplication on mingchendeMac-mini.local with PID 12532 (/Users/mingchen/code/java/other/legalAid/api/target/classes started by mingchen in /Users/mingchen/code/java/other/legalAid) +2025-04-16 13:18:42.564 DEBUG 12532 --- [restartedMain] com.mingchen.BlogApiApplication : Running with Spring Boot v2.2.7.RELEASE, Spring v5.2.6.RELEASE +2025-04-16 13:18:42.564 INFO 12532 --- [restartedMain] com.mingchen.BlogApiApplication : The following profiles are active: dev +2025-04-16 13:18:42.579 INFO 12532 --- [restartedMain] o.s.b.devtools.restart.ChangeableUrls : The Class-Path manifest attribute in /usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/jaxb-runtime-2.3.1.jar referenced one or more files that do not exist: file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/jaxb-api-2.3.1.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/txw2-2.3.1.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/istack-commons-runtime-3.0.7.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/stax-ex-1.8.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/FastInfoset-1.2.15.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/javax.activation-api-1.2.0.jar +2025-04-16 13:18:42.579 INFO 12532 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : Devtools property defaults active! Set 'spring.devtools.add-properties' to 'false' to disable +2025-04-16 13:18:42.579 INFO 12532 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : For additional web related logging consider setting the 'logging.level.web' property to 'DEBUG' +2025-04-16 13:18:42.785 INFO 12532 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Multiple Spring Data modules found, entering strict repository configuration mode! +2025-04-16 13:18:42.786 INFO 12532 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data Redis repositories in DEFAULT mode. +2025-04-16 13:18:42.799 INFO 12532 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 7ms. Found 0 Redis repository interfaces. +2025-04-16 13:18:43.065 INFO 12532 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 9092 (http) +2025-04-16 13:18:43.069 INFO 12532 --- [restartedMain] o.apache.catalina.core.StandardService : Starting service [Tomcat] +2025-04-16 13:18:43.069 INFO 12532 --- [restartedMain] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.34] +2025-04-16 13:18:43.094 INFO 12532 --- [restartedMain] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext +2025-04-16 13:18:43.094 INFO 12532 --- [restartedMain] o.s.web.context.ContextLoader : Root WebApplicationContext: initialization completed in 515 ms +2025-04-16 13:18:43.592 INFO 12532 --- [restartedMain] n.b.p.u.AbstractUserAgentAnalyzerDirect : - Loaded 90 files in 217 msec using expression: classpath*:UserAgents/**/*.yaml +2025-04-16 13:18:43.592 INFO 12532 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : +2025-04-16 13:18:43.592 INFO 12532 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : /-----------------------------------------------------------\ +2025-04-16 13:18:43.592 INFO 12532 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : | Yauaa 5.20 (v5.20 @ 2020-11-22T15:39:16Z) | +2025-04-16 13:18:43.592 INFO 12532 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : +-----------------------------------------------------------+ +2025-04-16 13:18:43.592 INFO 12532 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : | For more information: https://yauaa.basjes.nl | +2025-04-16 13:18:43.592 INFO 12532 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : | Copyright (C) 2013-2020 Niels Basjes - License Apache 2.0 | +2025-04-16 13:18:43.592 INFO 12532 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : \-----------------------------------------------------------/ +2025-04-16 13:18:43.592 INFO 12532 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : +2025-04-16 13:18:43.597 INFO 12532 --- [restartedMain] n.b.p.u.AbstractUserAgentAnalyzerDirect : Building all needed matchers for the requested 11 fields. +2025-04-16 13:18:43.648 INFO 12532 --- [restartedMain] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor' +2025-04-16 13:18:43.731 INFO 12532 --- [restartedMain] org.quartz.impl.StdSchedulerFactory : Using default implementation for ThreadExecutor +2025-04-16 13:18:43.735 INFO 12532 --- [restartedMain] org.quartz.core.SchedulerSignalerImpl : Initialized Scheduler Signaller of type: class org.quartz.core.SchedulerSignalerImpl +2025-04-16 13:18:43.735 INFO 12532 --- [restartedMain] org.quartz.core.QuartzScheduler : Quartz Scheduler v.2.3.2 created. +2025-04-16 13:18:43.735 INFO 12532 --- [restartedMain] org.quartz.simpl.RAMJobStore : RAMJobStore initialized. +2025-04-16 13:18:43.735 INFO 12532 --- [restartedMain] org.quartz.core.QuartzScheduler : Scheduler meta-data: Quartz Scheduler (v2.3.2) 'quartzScheduler' with instanceId 'NON_CLUSTERED' + Scheduler class: 'org.quartz.core.QuartzScheduler' - running locally. + NOT STARTED. + Currently in standby mode. + Number of jobs executed: 0 + Using thread pool 'org.quartz.simpl.SimpleThreadPool' - with 10 threads. + Using job-store 'org.quartz.simpl.RAMJobStore' - which does not support persistence. and is not clustered. + +2025-04-16 13:18:43.735 INFO 12532 --- [restartedMain] org.quartz.impl.StdSchedulerFactory : Quartz scheduler 'quartzScheduler' initialized from an externally provided properties instance. +2025-04-16 13:18:43.735 INFO 12532 --- [restartedMain] org.quartz.impl.StdSchedulerFactory : Quartz scheduler version: 2.3.2 +2025-04-16 13:18:43.735 INFO 12532 --- [restartedMain] org.quartz.core.QuartzScheduler : JobFactory set to: org.springframework.scheduling.quartz.SpringBeanJobFactory@b2a7ca7 +2025-04-16 13:18:43.767 INFO 12532 --- [restartedMain] o.s.s.web.DefaultSecurityFilterChain : Creating filter chain: any request, [org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter@44254d1c, org.springframework.security.web.context.SecurityContextPersistenceFilter@7c729000, org.springframework.security.web.header.HeaderWriterFilter@32d2109f, org.springframework.web.filter.CorsFilter@25b5d3d7, org.springframework.security.web.authentication.logout.LogoutFilter@45acc26e, com.mingchen.common.config.JwtLoginFilter@248a9cc8, com.mingchen.common.config.JwtFilter@2fd5f254, org.springframework.security.web.savedrequest.RequestCacheAwareFilter@786b238f, org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter@183ad941, org.springframework.security.web.authentication.AnonymousAuthenticationFilter@41f6071f, org.springframework.security.web.session.SessionManagementFilter@328245ed, org.springframework.security.web.access.ExceptionTranslationFilter@22e8c006, org.springframework.security.web.access.intercept.FilterSecurityInterceptor@1a8bbbde] +2025-04-16 13:18:43.779 INFO 12532 --- [restartedMain] o.s.b.d.a.OptionalLiveReloadServer : LiveReload server is running on port 35729 +2025-04-16 13:18:43.787 INFO 12532 --- [restartedMain] o.s.s.quartz.SchedulerFactoryBean : Starting Quartz Scheduler now +2025-04-16 13:18:43.787 INFO 12532 --- [restartedMain] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED started. +2025-04-16 13:18:43.796 INFO 12532 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 9092 (http) with context path '' +2025-04-16 13:18:43.799 INFO 12532 --- [restartedMain] com.mingchen.BlogApiApplication : Started BlogApiApplication in 1.393 seconds (JVM running for 1.662) +2025-04-16 13:18:45.553 INFO 12532 --- [http-nio-9092-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet' +2025-04-16 13:18:45.553 INFO 12532 --- [http-nio-9092-exec-1] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet' +2025-04-16 13:18:45.556 INFO 12532 --- [http-nio-9092-exec-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 3 ms +2025-04-16 13:18:58.371 ERROR 12532 --- [http-nio-9092-exec-1] org.thymeleaf.TemplateEngine : [THYMELEAF][http-nio-9092-exec-1] Exception processing template "admin/ai": Error resolving template [admin/ai], template might not exist or might not be accessible by any of the configured Template Resolvers + +org.thymeleaf.exceptions.TemplateInputException: Error resolving template [admin/ai], template might not exist or might not be accessible by any of the configured Template Resolvers + at org.thymeleaf.engine.TemplateManager.resolveTemplate(TemplateManager.java:869) + at org.thymeleaf.engine.TemplateManager.parseAndProcess(TemplateManager.java:607) + at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1098) + at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1072) + at org.thymeleaf.spring5.view.ThymeleafView.renderFragment(ThymeleafView.java:362) + at org.thymeleaf.spring5.view.ThymeleafView.render(ThymeleafView.java:189) + at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1373) + at org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1118) + at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1057) + at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943) + at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) + at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909) + at javax.servlet.http.HttpServlet.service(HttpServlet.java:523) + at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) + at javax.servlet.http.HttpServlet.service(HttpServlet.java:590) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:320) + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:126) + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:90) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:118) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:137) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:111) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:158) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at com.mingchen.common.config.JwtFilter.doFilter(JwtFilter.java:68) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:200) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:116) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:92) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:92) + at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:77) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:105) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:56) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:215) + at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:178) + at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:358) + at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:271) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202) + at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) + at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541) + at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139) + at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) + at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) + at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) + at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:373) + at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) + at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868) + at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1590) + at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) + at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) + at java.base/java.lang.Thread.run(Thread.java:840) + +2025-04-16 13:18:58.372 ERROR 12532 --- [http-nio-9092-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.thymeleaf.exceptions.TemplateInputException: Error resolving template [admin/ai], template might not exist or might not be accessible by any of the configured Template Resolvers] with root cause + +org.thymeleaf.exceptions.TemplateInputException: Error resolving template [admin/ai], template might not exist or might not be accessible by any of the configured Template Resolvers + at org.thymeleaf.engine.TemplateManager.resolveTemplate(TemplateManager.java:869) + at org.thymeleaf.engine.TemplateManager.parseAndProcess(TemplateManager.java:607) + at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1098) + at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1072) + at org.thymeleaf.spring5.view.ThymeleafView.renderFragment(ThymeleafView.java:362) + at org.thymeleaf.spring5.view.ThymeleafView.render(ThymeleafView.java:189) + at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1373) + at org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1118) + at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1057) + at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943) + at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) + at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909) + at javax.servlet.http.HttpServlet.service(HttpServlet.java:523) + at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) + at javax.servlet.http.HttpServlet.service(HttpServlet.java:590) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:320) + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:126) + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:90) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:118) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:137) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:111) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:158) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at com.mingchen.common.config.JwtFilter.doFilter(JwtFilter.java:68) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:200) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:116) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:92) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:92) + at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:77) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:105) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:56) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:215) + at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:178) + at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:358) + at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:271) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202) + at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) + at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541) + at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139) + at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) + at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) + at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) + at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:373) + at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) + at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868) + at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1590) + at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) + at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) + at java.base/java.lang.Thread.run(Thread.java:840) + +2025-04-16 13:21:56.975 INFO 12532 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED paused. +2025-04-16 13:21:56.976 INFO 12532 --- [SpringContextShutdownHook] o.s.s.quartz.SchedulerFactoryBean : Shutting down Quartz Scheduler +2025-04-16 13:21:56.976 INFO 12532 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED shutting down. +2025-04-16 13:21:56.976 INFO 12532 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED paused. +2025-04-16 13:21:56.976 INFO 12532 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED shutdown complete. +2025-04-16 13:21:56.977 INFO 12532 --- [SpringContextShutdownHook] o.s.s.concurrent.ThreadPoolTaskExecutor : Shutting down ExecutorService 'applicationTaskExecutor' +2025-04-16 13:21:59.603 INFO 12572 --- [restartedMain] com.mingchen.BlogApiApplication : Starting BlogApiApplication on mingchendeMac-mini.local with PID 12572 (/Users/mingchen/code/java/other/legalAid/api/target/classes started by mingchen in /Users/mingchen/code/java/other/legalAid) +2025-04-16 13:21:59.604 DEBUG 12572 --- [restartedMain] com.mingchen.BlogApiApplication : Running with Spring Boot v2.2.7.RELEASE, Spring v5.2.6.RELEASE +2025-04-16 13:21:59.604 INFO 12572 --- [restartedMain] com.mingchen.BlogApiApplication : The following profiles are active: dev +2025-04-16 13:21:59.619 INFO 12572 --- [restartedMain] o.s.b.devtools.restart.ChangeableUrls : The Class-Path manifest attribute in /usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/jaxb-runtime-2.3.1.jar referenced one or more files that do not exist: file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/jaxb-api-2.3.1.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/txw2-2.3.1.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/istack-commons-runtime-3.0.7.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/stax-ex-1.8.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/FastInfoset-1.2.15.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/javax.activation-api-1.2.0.jar +2025-04-16 13:21:59.620 INFO 12572 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : Devtools property defaults active! Set 'spring.devtools.add-properties' to 'false' to disable +2025-04-16 13:21:59.620 INFO 12572 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : For additional web related logging consider setting the 'logging.level.web' property to 'DEBUG' +2025-04-16 13:21:59.820 INFO 12572 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Multiple Spring Data modules found, entering strict repository configuration mode! +2025-04-16 13:21:59.821 INFO 12572 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data Redis repositories in DEFAULT mode. +2025-04-16 13:21:59.833 INFO 12572 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 8ms. Found 0 Redis repository interfaces. +2025-04-16 13:22:00.084 INFO 12572 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 9092 (http) +2025-04-16 13:22:00.087 INFO 12572 --- [restartedMain] o.apache.catalina.core.StandardService : Starting service [Tomcat] +2025-04-16 13:22:00.087 INFO 12572 --- [restartedMain] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.34] +2025-04-16 13:22:00.109 INFO 12572 --- [restartedMain] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext +2025-04-16 13:22:00.109 INFO 12572 --- [restartedMain] o.s.web.context.ContextLoader : Root WebApplicationContext: initialization completed in 489 ms +2025-04-16 13:22:00.588 INFO 12572 --- [restartedMain] n.b.p.u.AbstractUserAgentAnalyzerDirect : - Loaded 90 files in 212 msec using expression: classpath*:UserAgents/**/*.yaml +2025-04-16 13:22:00.588 INFO 12572 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : +2025-04-16 13:22:00.588 INFO 12572 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : /-----------------------------------------------------------\ +2025-04-16 13:22:00.588 INFO 12572 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : | Yauaa 5.20 (v5.20 @ 2020-11-22T15:39:16Z) | +2025-04-16 13:22:00.588 INFO 12572 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : +-----------------------------------------------------------+ +2025-04-16 13:22:00.588 INFO 12572 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : | For more information: https://yauaa.basjes.nl | +2025-04-16 13:22:00.588 INFO 12572 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : | Copyright (C) 2013-2020 Niels Basjes - License Apache 2.0 | +2025-04-16 13:22:00.588 INFO 12572 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : \-----------------------------------------------------------/ +2025-04-16 13:22:00.588 INFO 12572 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : +2025-04-16 13:22:00.592 INFO 12572 --- [restartedMain] n.b.p.u.AbstractUserAgentAnalyzerDirect : Building all needed matchers for the requested 11 fields. +2025-04-16 13:22:00.642 INFO 12572 --- [restartedMain] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor' +2025-04-16 13:22:00.720 INFO 12572 --- [restartedMain] org.quartz.impl.StdSchedulerFactory : Using default implementation for ThreadExecutor +2025-04-16 13:22:00.724 INFO 12572 --- [restartedMain] org.quartz.core.SchedulerSignalerImpl : Initialized Scheduler Signaller of type: class org.quartz.core.SchedulerSignalerImpl +2025-04-16 13:22:00.724 INFO 12572 --- [restartedMain] org.quartz.core.QuartzScheduler : Quartz Scheduler v.2.3.2 created. +2025-04-16 13:22:00.725 INFO 12572 --- [restartedMain] org.quartz.simpl.RAMJobStore : RAMJobStore initialized. +2025-04-16 13:22:00.725 INFO 12572 --- [restartedMain] org.quartz.core.QuartzScheduler : Scheduler meta-data: Quartz Scheduler (v2.3.2) 'quartzScheduler' with instanceId 'NON_CLUSTERED' + Scheduler class: 'org.quartz.core.QuartzScheduler' - running locally. + NOT STARTED. + Currently in standby mode. + Number of jobs executed: 0 + Using thread pool 'org.quartz.simpl.SimpleThreadPool' - with 10 threads. + Using job-store 'org.quartz.simpl.RAMJobStore' - which does not support persistence. and is not clustered. + +2025-04-16 13:22:00.725 INFO 12572 --- [restartedMain] org.quartz.impl.StdSchedulerFactory : Quartz scheduler 'quartzScheduler' initialized from an externally provided properties instance. +2025-04-16 13:22:00.725 INFO 12572 --- [restartedMain] org.quartz.impl.StdSchedulerFactory : Quartz scheduler version: 2.3.2 +2025-04-16 13:22:00.725 INFO 12572 --- [restartedMain] org.quartz.core.QuartzScheduler : JobFactory set to: org.springframework.scheduling.quartz.SpringBeanJobFactory@1b5ab15 +2025-04-16 13:22:00.755 INFO 12572 --- [restartedMain] o.s.s.web.DefaultSecurityFilterChain : Creating filter chain: any request, [org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter@9146ff4, org.springframework.security.web.context.SecurityContextPersistenceFilter@377e40bd, org.springframework.security.web.header.HeaderWriterFilter@996fe2e, org.springframework.web.filter.CorsFilter@3abe9c15, org.springframework.security.web.authentication.logout.LogoutFilter@499dc4c7, com.mingchen.common.config.JwtLoginFilter@2212ae5e, com.mingchen.common.config.JwtFilter@1aa10aab, org.springframework.security.web.savedrequest.RequestCacheAwareFilter@4ab3d44b, org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter@233f000d, org.springframework.security.web.authentication.AnonymousAuthenticationFilter@3060adc4, org.springframework.security.web.session.SessionManagementFilter@2c282850, org.springframework.security.web.access.ExceptionTranslationFilter@36df1aee, org.springframework.security.web.access.intercept.FilterSecurityInterceptor@65e710e8] +2025-04-16 13:22:00.766 INFO 12572 --- [restartedMain] o.s.b.d.a.OptionalLiveReloadServer : LiveReload server is running on port 35729 +2025-04-16 13:22:00.773 INFO 12572 --- [restartedMain] o.s.s.quartz.SchedulerFactoryBean : Starting Quartz Scheduler now +2025-04-16 13:22:00.773 INFO 12572 --- [restartedMain] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED started. +2025-04-16 13:22:00.782 INFO 12572 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 9092 (http) with context path '' +2025-04-16 13:22:00.784 INFO 12572 --- [restartedMain] com.mingchen.BlogApiApplication : Started BlogApiApplication in 1.32 seconds (JVM running for 1.605) +2025-04-16 13:22:06.483 INFO 12572 --- [http-nio-9092-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet' +2025-04-16 13:22:06.483 INFO 12572 --- [http-nio-9092-exec-1] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet' +2025-04-16 13:22:06.486 INFO 12572 --- [http-nio-9092-exec-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 3 ms +2025-04-16 13:23:11.665 ERROR 12572 --- [http-nio-9092-exec-1] org.thymeleaf.TemplateEngine : [THYMELEAF][http-nio-9092-exec-1] Exception processing template "admin/ai": Error resolving template [admin/ai], template might not exist or might not be accessible by any of the configured Template Resolvers + +org.thymeleaf.exceptions.TemplateInputException: Error resolving template [admin/ai], template might not exist or might not be accessible by any of the configured Template Resolvers + at org.thymeleaf.engine.TemplateManager.resolveTemplate(TemplateManager.java:869) + at org.thymeleaf.engine.TemplateManager.parseAndProcess(TemplateManager.java:607) + at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1098) + at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1072) + at org.thymeleaf.spring5.view.ThymeleafView.renderFragment(ThymeleafView.java:362) + at org.thymeleaf.spring5.view.ThymeleafView.render(ThymeleafView.java:189) + at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1373) + at org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1118) + at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1057) + at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943) + at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) + at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909) + at javax.servlet.http.HttpServlet.service(HttpServlet.java:523) + at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) + at javax.servlet.http.HttpServlet.service(HttpServlet.java:590) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:320) + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:126) + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:90) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:118) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:137) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:111) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:158) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at com.mingchen.common.config.JwtFilter.doFilter(JwtFilter.java:68) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:200) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:116) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:92) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:92) + at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:77) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:105) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:56) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:215) + at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:178) + at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:358) + at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:271) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202) + at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) + at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541) + at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139) + at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) + at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) + at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) + at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:373) + at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) + at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868) + at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1590) + at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) + at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) + at java.base/java.lang.Thread.run(Thread.java:840) + +2025-04-16 13:23:11.666 ERROR 12572 --- [http-nio-9092-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.thymeleaf.exceptions.TemplateInputException: Error resolving template [admin/ai], template might not exist or might not be accessible by any of the configured Template Resolvers] with root cause + +org.thymeleaf.exceptions.TemplateInputException: Error resolving template [admin/ai], template might not exist or might not be accessible by any of the configured Template Resolvers + at org.thymeleaf.engine.TemplateManager.resolveTemplate(TemplateManager.java:869) + at org.thymeleaf.engine.TemplateManager.parseAndProcess(TemplateManager.java:607) + at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1098) + at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1072) + at org.thymeleaf.spring5.view.ThymeleafView.renderFragment(ThymeleafView.java:362) + at org.thymeleaf.spring5.view.ThymeleafView.render(ThymeleafView.java:189) + at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1373) + at org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1118) + at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1057) + at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943) + at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) + at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909) + at javax.servlet.http.HttpServlet.service(HttpServlet.java:523) + at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) + at javax.servlet.http.HttpServlet.service(HttpServlet.java:590) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:320) + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:126) + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:90) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:118) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:137) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:111) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:158) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at com.mingchen.common.config.JwtFilter.doFilter(JwtFilter.java:68) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:200) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:116) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:92) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:92) + at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:77) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:105) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:56) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:215) + at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:178) + at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:358) + at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:271) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202) + at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) + at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541) + at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139) + at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) + at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) + at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) + at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:373) + at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) + at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868) + at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1590) + at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) + at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) + at java.base/java.lang.Thread.run(Thread.java:840) + +2025-04-16 13:23:55.218 INFO 12572 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED paused. +2025-04-16 13:23:55.220 INFO 12572 --- [SpringContextShutdownHook] o.s.s.quartz.SchedulerFactoryBean : Shutting down Quartz Scheduler +2025-04-16 13:23:55.220 INFO 12572 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED shutting down. +2025-04-16 13:23:55.220 INFO 12572 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED paused. +2025-04-16 13:23:55.220 INFO 12572 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED shutdown complete. +2025-04-16 13:23:55.220 INFO 12572 --- [SpringContextShutdownHook] o.s.s.concurrent.ThreadPoolTaskExecutor : Shutting down ExecutorService 'applicationTaskExecutor' +2025-04-16 13:23:57.245 INFO 12601 --- [restartedMain] com.mingchen.BlogApiApplication : Starting BlogApiApplication on mingchendeMac-mini.local with PID 12601 (/Users/mingchen/code/java/other/legalAid/api/target/classes started by mingchen in /Users/mingchen/code/java/other/legalAid) +2025-04-16 13:23:57.246 DEBUG 12601 --- [restartedMain] com.mingchen.BlogApiApplication : Running with Spring Boot v2.2.7.RELEASE, Spring v5.2.6.RELEASE +2025-04-16 13:23:57.246 INFO 12601 --- [restartedMain] com.mingchen.BlogApiApplication : The following profiles are active: dev +2025-04-16 13:23:57.265 INFO 12601 --- [restartedMain] o.s.b.devtools.restart.ChangeableUrls : The Class-Path manifest attribute in /usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/jaxb-runtime-2.3.1.jar referenced one or more files that do not exist: file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/jaxb-api-2.3.1.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/txw2-2.3.1.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/istack-commons-runtime-3.0.7.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/stax-ex-1.8.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/FastInfoset-1.2.15.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/javax.activation-api-1.2.0.jar +2025-04-16 13:23:57.265 INFO 12601 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : Devtools property defaults active! Set 'spring.devtools.add-properties' to 'false' to disable +2025-04-16 13:23:57.265 INFO 12601 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : For additional web related logging consider setting the 'logging.level.web' property to 'DEBUG' +2025-04-16 13:23:57.491 INFO 12601 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Multiple Spring Data modules found, entering strict repository configuration mode! +2025-04-16 13:23:57.492 INFO 12601 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data Redis repositories in DEFAULT mode. +2025-04-16 13:23:57.504 INFO 12601 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 7ms. Found 0 Redis repository interfaces. +2025-04-16 13:23:57.755 INFO 12601 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 9092 (http) +2025-04-16 13:23:57.758 INFO 12601 --- [restartedMain] o.apache.catalina.core.StandardService : Starting service [Tomcat] +2025-04-16 13:23:57.762 INFO 12601 --- [restartedMain] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.34] +2025-04-16 13:23:57.784 INFO 12601 --- [restartedMain] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext +2025-04-16 13:23:57.784 INFO 12601 --- [restartedMain] o.s.web.context.ContextLoader : Root WebApplicationContext: initialization completed in 519 ms +2025-04-16 13:23:58.270 INFO 12601 --- [restartedMain] n.b.p.u.AbstractUserAgentAnalyzerDirect : - Loaded 90 files in 207 msec using expression: classpath*:UserAgents/**/*.yaml +2025-04-16 13:23:58.270 INFO 12601 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : +2025-04-16 13:23:58.270 INFO 12601 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : /-----------------------------------------------------------\ +2025-04-16 13:23:58.270 INFO 12601 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : | Yauaa 5.20 (v5.20 @ 2020-11-22T15:39:16Z) | +2025-04-16 13:23:58.270 INFO 12601 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : +-----------------------------------------------------------+ +2025-04-16 13:23:58.270 INFO 12601 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : | For more information: https://yauaa.basjes.nl | +2025-04-16 13:23:58.270 INFO 12601 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : | Copyright (C) 2013-2020 Niels Basjes - License Apache 2.0 | +2025-04-16 13:23:58.270 INFO 12601 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : \-----------------------------------------------------------/ +2025-04-16 13:23:58.270 INFO 12601 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : +2025-04-16 13:23:58.274 INFO 12601 --- [restartedMain] n.b.p.u.AbstractUserAgentAnalyzerDirect : Building all needed matchers for the requested 11 fields. +2025-04-16 13:23:58.326 INFO 12601 --- [restartedMain] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor' +2025-04-16 13:23:58.418 INFO 12601 --- [restartedMain] org.quartz.impl.StdSchedulerFactory : Using default implementation for ThreadExecutor +2025-04-16 13:23:58.422 INFO 12601 --- [restartedMain] org.quartz.core.SchedulerSignalerImpl : Initialized Scheduler Signaller of type: class org.quartz.core.SchedulerSignalerImpl +2025-04-16 13:23:58.422 INFO 12601 --- [restartedMain] org.quartz.core.QuartzScheduler : Quartz Scheduler v.2.3.2 created. +2025-04-16 13:23:58.423 INFO 12601 --- [restartedMain] org.quartz.simpl.RAMJobStore : RAMJobStore initialized. +2025-04-16 13:23:58.423 INFO 12601 --- [restartedMain] org.quartz.core.QuartzScheduler : Scheduler meta-data: Quartz Scheduler (v2.3.2) 'quartzScheduler' with instanceId 'NON_CLUSTERED' + Scheduler class: 'org.quartz.core.QuartzScheduler' - running locally. + NOT STARTED. + Currently in standby mode. + Number of jobs executed: 0 + Using thread pool 'org.quartz.simpl.SimpleThreadPool' - with 10 threads. + Using job-store 'org.quartz.simpl.RAMJobStore' - which does not support persistence. and is not clustered. + +2025-04-16 13:23:58.423 INFO 12601 --- [restartedMain] org.quartz.impl.StdSchedulerFactory : Quartz scheduler 'quartzScheduler' initialized from an externally provided properties instance. +2025-04-16 13:23:58.423 INFO 12601 --- [restartedMain] org.quartz.impl.StdSchedulerFactory : Quartz scheduler version: 2.3.2 +2025-04-16 13:23:58.423 INFO 12601 --- [restartedMain] org.quartz.core.QuartzScheduler : JobFactory set to: org.springframework.scheduling.quartz.SpringBeanJobFactory@2dad95a1 +2025-04-16 13:23:58.458 INFO 12601 --- [restartedMain] o.s.s.web.DefaultSecurityFilterChain : Creating filter chain: any request, [org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter@7333ce72, org.springframework.security.web.context.SecurityContextPersistenceFilter@1090c67c, org.springframework.security.web.header.HeaderWriterFilter@5e6bba07, org.springframework.web.filter.CorsFilter@7507535e, org.springframework.security.web.authentication.logout.LogoutFilter@44291414, com.mingchen.common.config.JwtLoginFilter@5a0cc801, com.mingchen.common.config.JwtFilter@4410214, org.springframework.security.web.savedrequest.RequestCacheAwareFilter@1c06907d, org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter@1f7ecdf9, org.springframework.security.web.authentication.AnonymousAuthenticationFilter@69ec1cb0, org.springframework.security.web.session.SessionManagementFilter@3d7a6fc4, org.springframework.security.web.access.ExceptionTranslationFilter@11fd93d9, org.springframework.security.web.access.intercept.FilterSecurityInterceptor@45d3b40b] +2025-04-16 13:23:58.469 INFO 12601 --- [restartedMain] o.s.b.d.a.OptionalLiveReloadServer : LiveReload server is running on port 35729 +2025-04-16 13:23:58.478 INFO 12601 --- [restartedMain] o.s.s.quartz.SchedulerFactoryBean : Starting Quartz Scheduler now +2025-04-16 13:23:58.478 INFO 12601 --- [restartedMain] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED started. +2025-04-16 13:23:58.488 INFO 12601 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 9092 (http) with context path '' +2025-04-16 13:23:58.490 INFO 12601 --- [restartedMain] com.mingchen.BlogApiApplication : Started BlogApiApplication in 1.419 seconds (JVM running for 1.694) +2025-04-16 13:24:01.658 INFO 12601 --- [http-nio-9092-exec-2] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet' +2025-04-16 13:24:01.658 INFO 12601 --- [http-nio-9092-exec-2] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet' +2025-04-16 13:24:01.661 INFO 12601 --- [http-nio-9092-exec-2] o.s.web.servlet.DispatcherServlet : Completed initialization in 3 ms +2025-04-16 13:24:01.742 ERROR 12601 --- [http-nio-9092-exec-2] org.thymeleaf.TemplateEngine : [THYMELEAF][http-nio-9092-exec-2] Exception processing template "admin/ai": Error resolving template [admin/ai], template might not exist or might not be accessible by any of the configured Template Resolvers + +org.thymeleaf.exceptions.TemplateInputException: Error resolving template [admin/ai], template might not exist or might not be accessible by any of the configured Template Resolvers + at org.thymeleaf.engine.TemplateManager.resolveTemplate(TemplateManager.java:869) + at org.thymeleaf.engine.TemplateManager.parseAndProcess(TemplateManager.java:607) + at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1098) + at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1072) + at org.thymeleaf.spring5.view.ThymeleafView.renderFragment(ThymeleafView.java:362) + at org.thymeleaf.spring5.view.ThymeleafView.render(ThymeleafView.java:189) + at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1373) + at org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1118) + at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1057) + at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943) + at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) + at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909) + at javax.servlet.http.HttpServlet.service(HttpServlet.java:523) + at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) + at javax.servlet.http.HttpServlet.service(HttpServlet.java:590) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:320) + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:126) + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:90) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:118) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:137) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:111) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:158) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at com.mingchen.common.config.JwtFilter.doFilter(JwtFilter.java:68) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:200) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:116) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:92) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:92) + at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:77) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:105) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:56) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:215) + at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:178) + at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:358) + at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:271) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202) + at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) + at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541) + at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139) + at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) + at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) + at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) + at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:373) + at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) + at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868) + at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1590) + at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) + at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) + at java.base/java.lang.Thread.run(Thread.java:840) + +2025-04-16 13:24:01.743 ERROR 12601 --- [http-nio-9092-exec-2] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.thymeleaf.exceptions.TemplateInputException: Error resolving template [admin/ai], template might not exist or might not be accessible by any of the configured Template Resolvers] with root cause + +org.thymeleaf.exceptions.TemplateInputException: Error resolving template [admin/ai], template might not exist or might not be accessible by any of the configured Template Resolvers + at org.thymeleaf.engine.TemplateManager.resolveTemplate(TemplateManager.java:869) + at org.thymeleaf.engine.TemplateManager.parseAndProcess(TemplateManager.java:607) + at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1098) + at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1072) + at org.thymeleaf.spring5.view.ThymeleafView.renderFragment(ThymeleafView.java:362) + at org.thymeleaf.spring5.view.ThymeleafView.render(ThymeleafView.java:189) + at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1373) + at org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1118) + at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1057) + at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943) + at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) + at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909) + at javax.servlet.http.HttpServlet.service(HttpServlet.java:523) + at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) + at javax.servlet.http.HttpServlet.service(HttpServlet.java:590) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:320) + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:126) + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:90) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:118) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:137) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:111) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:158) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at com.mingchen.common.config.JwtFilter.doFilter(JwtFilter.java:68) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:200) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:116) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:92) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:92) + at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:77) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:105) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:56) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:215) + at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:178) + at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:358) + at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:271) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202) + at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) + at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541) + at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139) + at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) + at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) + at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) + at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:373) + at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) + at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868) + at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1590) + at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) + at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) + at java.base/java.lang.Thread.run(Thread.java:840) + +2025-04-16 13:24:32.155 INFO 12601 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED paused. +2025-04-16 13:24:32.156 INFO 12601 --- [SpringContextShutdownHook] o.s.s.quartz.SchedulerFactoryBean : Shutting down Quartz Scheduler +2025-04-16 13:24:32.156 INFO 12601 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED shutting down. +2025-04-16 13:24:32.156 INFO 12601 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED paused. +2025-04-16 13:24:32.156 INFO 12601 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED shutdown complete. +2025-04-16 13:24:32.157 INFO 12601 --- [SpringContextShutdownHook] o.s.s.concurrent.ThreadPoolTaskExecutor : Shutting down ExecutorService 'applicationTaskExecutor' +2025-04-16 13:24:34.179 INFO 12614 --- [restartedMain] com.mingchen.BlogApiApplication : Starting BlogApiApplication on mingchendeMac-mini.local with PID 12614 (/Users/mingchen/code/java/other/legalAid/api/target/classes started by mingchen in /Users/mingchen/code/java/other/legalAid) +2025-04-16 13:24:34.181 DEBUG 12614 --- [restartedMain] com.mingchen.BlogApiApplication : Running with Spring Boot v2.2.7.RELEASE, Spring v5.2.6.RELEASE +2025-04-16 13:24:34.181 INFO 12614 --- [restartedMain] com.mingchen.BlogApiApplication : The following profiles are active: dev +2025-04-16 13:24:34.198 INFO 12614 --- [restartedMain] o.s.b.devtools.restart.ChangeableUrls : The Class-Path manifest attribute in /usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/jaxb-runtime-2.3.1.jar referenced one or more files that do not exist: file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/jaxb-api-2.3.1.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/txw2-2.3.1.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/istack-commons-runtime-3.0.7.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/stax-ex-1.8.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/FastInfoset-1.2.15.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/javax.activation-api-1.2.0.jar +2025-04-16 13:24:34.198 INFO 12614 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : Devtools property defaults active! Set 'spring.devtools.add-properties' to 'false' to disable +2025-04-16 13:24:34.198 INFO 12614 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : For additional web related logging consider setting the 'logging.level.web' property to 'DEBUG' +2025-04-16 13:24:34.396 INFO 12614 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Multiple Spring Data modules found, entering strict repository configuration mode! +2025-04-16 13:24:34.397 INFO 12614 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data Redis repositories in DEFAULT mode. +2025-04-16 13:24:34.407 INFO 12614 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 6ms. Found 0 Redis repository interfaces. +2025-04-16 13:24:34.650 INFO 12614 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 9092 (http) +2025-04-16 13:24:34.653 INFO 12614 --- [restartedMain] o.apache.catalina.core.StandardService : Starting service [Tomcat] +2025-04-16 13:24:34.653 INFO 12614 --- [restartedMain] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.34] +2025-04-16 13:24:34.675 INFO 12614 --- [restartedMain] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext +2025-04-16 13:24:34.675 INFO 12614 --- [restartedMain] o.s.web.context.ContextLoader : Root WebApplicationContext: initialization completed in 477 ms +2025-04-16 13:24:35.131 INFO 12614 --- [restartedMain] n.b.p.u.AbstractUserAgentAnalyzerDirect : - Loaded 90 files in 209 msec using expression: classpath*:UserAgents/**/*.yaml +2025-04-16 13:24:35.131 INFO 12614 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : +2025-04-16 13:24:35.132 INFO 12614 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : /-----------------------------------------------------------\ +2025-04-16 13:24:35.132 INFO 12614 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : | Yauaa 5.20 (v5.20 @ 2020-11-22T15:39:16Z) | +2025-04-16 13:24:35.132 INFO 12614 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : +-----------------------------------------------------------+ +2025-04-16 13:24:35.132 INFO 12614 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : | For more information: https://yauaa.basjes.nl | +2025-04-16 13:24:35.132 INFO 12614 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : | Copyright (C) 2013-2020 Niels Basjes - License Apache 2.0 | +2025-04-16 13:24:35.132 INFO 12614 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : \-----------------------------------------------------------/ +2025-04-16 13:24:35.132 INFO 12614 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : +2025-04-16 13:24:35.134 INFO 12614 --- [restartedMain] n.b.p.u.AbstractUserAgentAnalyzerDirect : Building all needed matchers for the requested 11 fields. +2025-04-16 13:24:35.182 INFO 12614 --- [restartedMain] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor' +2025-04-16 13:24:35.261 INFO 12614 --- [restartedMain] org.quartz.impl.StdSchedulerFactory : Using default implementation for ThreadExecutor +2025-04-16 13:24:35.265 INFO 12614 --- [restartedMain] org.quartz.core.SchedulerSignalerImpl : Initialized Scheduler Signaller of type: class org.quartz.core.SchedulerSignalerImpl +2025-04-16 13:24:35.265 INFO 12614 --- [restartedMain] org.quartz.core.QuartzScheduler : Quartz Scheduler v.2.3.2 created. +2025-04-16 13:24:35.265 INFO 12614 --- [restartedMain] org.quartz.simpl.RAMJobStore : RAMJobStore initialized. +2025-04-16 13:24:35.265 INFO 12614 --- [restartedMain] org.quartz.core.QuartzScheduler : Scheduler meta-data: Quartz Scheduler (v2.3.2) 'quartzScheduler' with instanceId 'NON_CLUSTERED' + Scheduler class: 'org.quartz.core.QuartzScheduler' - running locally. + NOT STARTED. + Currently in standby mode. + Number of jobs executed: 0 + Using thread pool 'org.quartz.simpl.SimpleThreadPool' - with 10 threads. + Using job-store 'org.quartz.simpl.RAMJobStore' - which does not support persistence. and is not clustered. + +2025-04-16 13:24:35.265 INFO 12614 --- [restartedMain] org.quartz.impl.StdSchedulerFactory : Quartz scheduler 'quartzScheduler' initialized from an externally provided properties instance. +2025-04-16 13:24:35.265 INFO 12614 --- [restartedMain] org.quartz.impl.StdSchedulerFactory : Quartz scheduler version: 2.3.2 +2025-04-16 13:24:35.265 INFO 12614 --- [restartedMain] org.quartz.core.QuartzScheduler : JobFactory set to: org.springframework.scheduling.quartz.SpringBeanJobFactory@488cd449 +2025-04-16 13:24:35.296 INFO 12614 --- [restartedMain] o.s.s.web.DefaultSecurityFilterChain : Creating filter chain: any request, [org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter@44fedbe4, org.springframework.security.web.context.SecurityContextPersistenceFilter@ac85fd5, org.springframework.security.web.header.HeaderWriterFilter@41f3a81, org.springframework.web.filter.CorsFilter@7bb234f, org.springframework.security.web.authentication.logout.LogoutFilter@470b3f44, com.mingchen.common.config.JwtLoginFilter@2a6f7962, com.mingchen.common.config.JwtFilter@2426e016, org.springframework.security.web.savedrequest.RequestCacheAwareFilter@6546f457, org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter@12a3b336, org.springframework.security.web.authentication.AnonymousAuthenticationFilter@16b53e8d, org.springframework.security.web.session.SessionManagementFilter@4376e417, org.springframework.security.web.access.ExceptionTranslationFilter@13f73eb3, org.springframework.security.web.access.intercept.FilterSecurityInterceptor@cda0942] +2025-04-16 13:24:35.307 INFO 12614 --- [restartedMain] o.s.b.d.a.OptionalLiveReloadServer : LiveReload server is running on port 35729 +2025-04-16 13:24:35.315 INFO 12614 --- [restartedMain] o.s.s.quartz.SchedulerFactoryBean : Starting Quartz Scheduler now +2025-04-16 13:24:35.315 INFO 12614 --- [restartedMain] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED started. +2025-04-16 13:24:35.324 INFO 12614 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 9092 (http) with context path '' +2025-04-16 13:24:35.326 INFO 12614 --- [restartedMain] com.mingchen.BlogApiApplication : Started BlogApiApplication in 1.313 seconds (JVM running for 1.536) +2025-04-16 13:24:38.183 INFO 12614 --- [http-nio-9092-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet' +2025-04-16 13:24:38.183 INFO 12614 --- [http-nio-9092-exec-1] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet' +2025-04-16 13:24:38.186 INFO 12614 --- [http-nio-9092-exec-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 3 ms +2025-04-16 13:24:38.266 ERROR 12614 --- [http-nio-9092-exec-1] org.thymeleaf.TemplateEngine : [THYMELEAF][http-nio-9092-exec-1] Exception processing template "admin/ai": Error resolving template [admin/ai], template might not exist or might not be accessible by any of the configured Template Resolvers + +org.thymeleaf.exceptions.TemplateInputException: Error resolving template [admin/ai], template might not exist or might not be accessible by any of the configured Template Resolvers + at org.thymeleaf.engine.TemplateManager.resolveTemplate(TemplateManager.java:869) + at org.thymeleaf.engine.TemplateManager.parseAndProcess(TemplateManager.java:607) + at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1098) + at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1072) + at org.thymeleaf.spring5.view.ThymeleafView.renderFragment(ThymeleafView.java:362) + at org.thymeleaf.spring5.view.ThymeleafView.render(ThymeleafView.java:189) + at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1373) + at org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1118) + at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1057) + at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943) + at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) + at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909) + at javax.servlet.http.HttpServlet.service(HttpServlet.java:523) + at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) + at javax.servlet.http.HttpServlet.service(HttpServlet.java:590) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:320) + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:126) + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:90) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:118) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:137) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:111) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:158) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at com.mingchen.common.config.JwtFilter.doFilter(JwtFilter.java:68) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:200) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:116) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:92) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:92) + at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:77) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:105) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:56) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:215) + at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:178) + at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:358) + at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:271) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202) + at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) + at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541) + at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139) + at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) + at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) + at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) + at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:373) + at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) + at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868) + at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1590) + at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) + at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) + at java.base/java.lang.Thread.run(Thread.java:840) + +2025-04-16 13:24:38.267 ERROR 12614 --- [http-nio-9092-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.thymeleaf.exceptions.TemplateInputException: Error resolving template [admin/ai], template might not exist or might not be accessible by any of the configured Template Resolvers] with root cause + +org.thymeleaf.exceptions.TemplateInputException: Error resolving template [admin/ai], template might not exist or might not be accessible by any of the configured Template Resolvers + at org.thymeleaf.engine.TemplateManager.resolveTemplate(TemplateManager.java:869) + at org.thymeleaf.engine.TemplateManager.parseAndProcess(TemplateManager.java:607) + at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1098) + at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1072) + at org.thymeleaf.spring5.view.ThymeleafView.renderFragment(ThymeleafView.java:362) + at org.thymeleaf.spring5.view.ThymeleafView.render(ThymeleafView.java:189) + at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1373) + at org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1118) + at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1057) + at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943) + at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) + at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909) + at javax.servlet.http.HttpServlet.service(HttpServlet.java:523) + at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) + at javax.servlet.http.HttpServlet.service(HttpServlet.java:590) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:320) + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:126) + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:90) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:118) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:137) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:111) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:158) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at com.mingchen.common.config.JwtFilter.doFilter(JwtFilter.java:68) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:200) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:116) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:92) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:92) + at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:77) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:105) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:56) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:215) + at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:178) + at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:358) + at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:271) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202) + at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) + at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541) + at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139) + at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) + at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) + at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) + at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:373) + at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) + at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868) + at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1590) + at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) + at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) + at java.base/java.lang.Thread.run(Thread.java:840) + +2025-04-16 13:25:50.430 DEBUG 12614 --- [http-nio-9092-exec-4] c.mingchen.common.config.JwtLoginFilter : Request is to process authentication +2025-04-16 13:25:50.498 INFO 12614 --- [http-nio-9092-exec-4] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting... +2025-04-16 13:25:50.994 INFO 12614 --- [http-nio-9092-exec-4] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed. +2025-04-16 13:25:51.006 DEBUG 12614 --- [http-nio-9092-exec-4] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-16 13:25:51.030 DEBUG 12614 --- [http-nio-9092-exec-4] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-16 13:25:51.099 DEBUG 12614 --- [http-nio-9092-exec-4] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-16 13:28:52.719 INFO 12614 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED paused. +2025-04-16 13:28:52.720 INFO 12614 --- [SpringContextShutdownHook] o.s.s.quartz.SchedulerFactoryBean : Shutting down Quartz Scheduler +2025-04-16 13:28:52.720 INFO 12614 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED shutting down. +2025-04-16 13:28:52.720 INFO 12614 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED paused. +2025-04-16 13:28:52.720 INFO 12614 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED shutdown complete. +2025-04-16 13:28:52.721 INFO 12614 --- [SpringContextShutdownHook] o.s.s.concurrent.ThreadPoolTaskExecutor : Shutting down ExecutorService 'applicationTaskExecutor' +2025-04-16 13:28:52.726 INFO 12614 --- [SpringContextShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown initiated... +2025-04-16 13:28:52.729 INFO 12614 --- [SpringContextShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown completed. +2025-04-16 13:28:54.710 INFO 12673 --- [restartedMain] com.mingchen.BlogApiApplication : Starting BlogApiApplication on mingchendeMac-mini.local with PID 12673 (/Users/mingchen/code/java/other/legalAid/api/target/classes started by mingchen in /Users/mingchen/code/java/other/legalAid) +2025-04-16 13:28:54.711 DEBUG 12673 --- [restartedMain] com.mingchen.BlogApiApplication : Running with Spring Boot v2.2.7.RELEASE, Spring v5.2.6.RELEASE +2025-04-16 13:28:54.712 INFO 12673 --- [restartedMain] com.mingchen.BlogApiApplication : The following profiles are active: dev +2025-04-16 13:28:54.728 INFO 12673 --- [restartedMain] o.s.b.devtools.restart.ChangeableUrls : The Class-Path manifest attribute in /usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/jaxb-runtime-2.3.1.jar referenced one or more files that do not exist: file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/jaxb-api-2.3.1.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/txw2-2.3.1.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/istack-commons-runtime-3.0.7.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/stax-ex-1.8.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/FastInfoset-1.2.15.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/javax.activation-api-1.2.0.jar +2025-04-16 13:28:54.728 INFO 12673 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : Devtools property defaults active! Set 'spring.devtools.add-properties' to 'false' to disable +2025-04-16 13:28:54.728 INFO 12673 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : For additional web related logging consider setting the 'logging.level.web' property to 'DEBUG' +2025-04-16 13:28:54.946 INFO 12673 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Multiple Spring Data modules found, entering strict repository configuration mode! +2025-04-16 13:28:54.947 INFO 12673 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data Redis repositories in DEFAULT mode. +2025-04-16 13:28:54.959 INFO 12673 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 7ms. Found 0 Redis repository interfaces. +2025-04-16 13:28:55.226 INFO 12673 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 9092 (http) +2025-04-16 13:28:55.229 INFO 12673 --- [restartedMain] o.apache.catalina.core.StandardService : Starting service [Tomcat] +2025-04-16 13:28:55.229 INFO 12673 --- [restartedMain] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.34] +2025-04-16 13:28:55.254 INFO 12673 --- [restartedMain] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext +2025-04-16 13:28:55.254 INFO 12673 --- [restartedMain] o.s.web.context.ContextLoader : Root WebApplicationContext: initialization completed in 526 ms +2025-04-16 13:28:55.742 INFO 12673 --- [restartedMain] n.b.p.u.AbstractUserAgentAnalyzerDirect : - Loaded 90 files in 208 msec using expression: classpath*:UserAgents/**/*.yaml +2025-04-16 13:28:55.743 INFO 12673 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : +2025-04-16 13:28:55.743 INFO 12673 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : /-----------------------------------------------------------\ +2025-04-16 13:28:55.743 INFO 12673 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : | Yauaa 5.20 (v5.20 @ 2020-11-22T15:39:16Z) | +2025-04-16 13:28:55.743 INFO 12673 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : +-----------------------------------------------------------+ +2025-04-16 13:28:55.743 INFO 12673 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : | For more information: https://yauaa.basjes.nl | +2025-04-16 13:28:55.743 INFO 12673 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : | Copyright (C) 2013-2020 Niels Basjes - License Apache 2.0 | +2025-04-16 13:28:55.743 INFO 12673 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : \-----------------------------------------------------------/ +2025-04-16 13:28:55.743 INFO 12673 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : +2025-04-16 13:28:55.747 INFO 12673 --- [restartedMain] n.b.p.u.AbstractUserAgentAnalyzerDirect : Building all needed matchers for the requested 11 fields. +2025-04-16 13:28:55.795 INFO 12673 --- [restartedMain] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor' +2025-04-16 13:28:55.875 INFO 12673 --- [restartedMain] org.quartz.impl.StdSchedulerFactory : Using default implementation for ThreadExecutor +2025-04-16 13:28:55.878 INFO 12673 --- [restartedMain] org.quartz.core.SchedulerSignalerImpl : Initialized Scheduler Signaller of type: class org.quartz.core.SchedulerSignalerImpl +2025-04-16 13:28:55.878 INFO 12673 --- [restartedMain] org.quartz.core.QuartzScheduler : Quartz Scheduler v.2.3.2 created. +2025-04-16 13:28:55.879 INFO 12673 --- [restartedMain] org.quartz.simpl.RAMJobStore : RAMJobStore initialized. +2025-04-16 13:28:55.879 INFO 12673 --- [restartedMain] org.quartz.core.QuartzScheduler : Scheduler meta-data: Quartz Scheduler (v2.3.2) 'quartzScheduler' with instanceId 'NON_CLUSTERED' + Scheduler class: 'org.quartz.core.QuartzScheduler' - running locally. + NOT STARTED. + Currently in standby mode. + Number of jobs executed: 0 + Using thread pool 'org.quartz.simpl.SimpleThreadPool' - with 10 threads. + Using job-store 'org.quartz.simpl.RAMJobStore' - which does not support persistence. and is not clustered. + +2025-04-16 13:28:55.879 INFO 12673 --- [restartedMain] org.quartz.impl.StdSchedulerFactory : Quartz scheduler 'quartzScheduler' initialized from an externally provided properties instance. +2025-04-16 13:28:55.879 INFO 12673 --- [restartedMain] org.quartz.impl.StdSchedulerFactory : Quartz scheduler version: 2.3.2 +2025-04-16 13:28:55.879 INFO 12673 --- [restartedMain] org.quartz.core.QuartzScheduler : JobFactory set to: org.springframework.scheduling.quartz.SpringBeanJobFactory@74d2f04a +2025-04-16 13:28:55.909 INFO 12673 --- [restartedMain] o.s.s.web.DefaultSecurityFilterChain : Creating filter chain: any request, [org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter@6831c992, org.springframework.security.web.context.SecurityContextPersistenceFilter@7ab904ce, org.springframework.security.web.header.HeaderWriterFilter@1045446c, org.springframework.web.filter.CorsFilter@31dde10f, org.springframework.security.web.authentication.logout.LogoutFilter@6d51e6e, com.mingchen.common.config.JwtLoginFilter@19f56fee, com.mingchen.common.config.JwtFilter@5fddebd1, org.springframework.security.web.savedrequest.RequestCacheAwareFilter@4aff2684, org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter@6f8f12ac, org.springframework.security.web.authentication.AnonymousAuthenticationFilter@3946d4e1, org.springframework.security.web.session.SessionManagementFilter@50a00406, org.springframework.security.web.access.ExceptionTranslationFilter@5a4f694, org.springframework.security.web.access.intercept.FilterSecurityInterceptor@6d8f1580] +2025-04-16 13:28:55.920 INFO 12673 --- [restartedMain] o.s.b.d.a.OptionalLiveReloadServer : LiveReload server is running on port 35729 +2025-04-16 13:28:55.927 INFO 12673 --- [restartedMain] o.s.s.quartz.SchedulerFactoryBean : Starting Quartz Scheduler now +2025-04-16 13:28:55.928 INFO 12673 --- [restartedMain] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED started. +2025-04-16 13:28:55.936 INFO 12673 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 9092 (http) with context path '' +2025-04-16 13:28:55.938 INFO 12673 --- [restartedMain] com.mingchen.BlogApiApplication : Started BlogApiApplication in 1.392 seconds (JVM running for 1.622) +2025-04-16 13:28:59.472 INFO 12673 --- [http-nio-9092-exec-2] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet' +2025-04-16 13:28:59.472 INFO 12673 --- [http-nio-9092-exec-2] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet' +2025-04-16 13:28:59.474 INFO 12673 --- [http-nio-9092-exec-2] o.s.web.servlet.DispatcherServlet : Completed initialization in 2 ms +2025-04-16 13:29:02.869 ERROR 12673 --- [http-nio-9092-exec-2] org.thymeleaf.TemplateEngine : [THYMELEAF][http-nio-9092-exec-2] Exception processing template "admin/ai/test": Error resolving template [admin/ai/test], template might not exist or might not be accessible by any of the configured Template Resolvers + +org.thymeleaf.exceptions.TemplateInputException: Error resolving template [admin/ai/test], template might not exist or might not be accessible by any of the configured Template Resolvers + at org.thymeleaf.engine.TemplateManager.resolveTemplate(TemplateManager.java:869) + at org.thymeleaf.engine.TemplateManager.parseAndProcess(TemplateManager.java:607) + at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1098) + at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1072) + at org.thymeleaf.spring5.view.ThymeleafView.renderFragment(ThymeleafView.java:362) + at org.thymeleaf.spring5.view.ThymeleafView.render(ThymeleafView.java:189) + at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1373) + at org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1118) + at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1057) + at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943) + at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) + at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898) + at javax.servlet.http.HttpServlet.service(HttpServlet.java:503) + at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) + at javax.servlet.http.HttpServlet.service(HttpServlet.java:590) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:320) + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:126) + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:90) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:118) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:137) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:111) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:158) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at com.mingchen.common.config.JwtFilter.doFilter(JwtFilter.java:68) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:200) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:116) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:92) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:92) + at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:77) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:105) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:56) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:215) + at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:178) + at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:358) + at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:271) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202) + at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) + at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541) + at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139) + at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) + at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) + at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) + at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:373) + at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) + at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868) + at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1590) + at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) + at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) + at java.base/java.lang.Thread.run(Thread.java:840) + +2025-04-16 13:29:02.871 ERROR 12673 --- [http-nio-9092-exec-2] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.thymeleaf.exceptions.TemplateInputException: Error resolving template [admin/ai/test], template might not exist or might not be accessible by any of the configured Template Resolvers] with root cause + +org.thymeleaf.exceptions.TemplateInputException: Error resolving template [admin/ai/test], template might not exist or might not be accessible by any of the configured Template Resolvers + at org.thymeleaf.engine.TemplateManager.resolveTemplate(TemplateManager.java:869) + at org.thymeleaf.engine.TemplateManager.parseAndProcess(TemplateManager.java:607) + at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1098) + at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1072) + at org.thymeleaf.spring5.view.ThymeleafView.renderFragment(ThymeleafView.java:362) + at org.thymeleaf.spring5.view.ThymeleafView.render(ThymeleafView.java:189) + at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1373) + at org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1118) + at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1057) + at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943) + at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) + at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898) + at javax.servlet.http.HttpServlet.service(HttpServlet.java:503) + at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) + at javax.servlet.http.HttpServlet.service(HttpServlet.java:590) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:320) + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:126) + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:90) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:118) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:137) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:111) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:158) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at com.mingchen.common.config.JwtFilter.doFilter(JwtFilter.java:68) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:200) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:116) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:92) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:92) + at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:77) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:105) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:56) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:215) + at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:178) + at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:358) + at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:271) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202) + at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) + at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541) + at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139) + at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) + at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) + at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) + at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:373) + at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) + at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868) + at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1590) + at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) + at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) + at java.base/java.lang.Thread.run(Thread.java:840) + +2025-04-16 13:29:35.656 INFO 12673 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED paused. +2025-04-16 13:29:35.657 INFO 12673 --- [SpringContextShutdownHook] o.s.s.quartz.SchedulerFactoryBean : Shutting down Quartz Scheduler +2025-04-16 13:29:35.657 INFO 12673 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED shutting down. +2025-04-16 13:29:35.657 INFO 12673 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED paused. +2025-04-16 13:29:35.657 INFO 12673 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED shutdown complete. +2025-04-16 13:29:35.658 INFO 12673 --- [SpringContextShutdownHook] o.s.s.concurrent.ThreadPoolTaskExecutor : Shutting down ExecutorService 'applicationTaskExecutor' +2025-04-16 13:29:37.840 INFO 12683 --- [restartedMain] com.mingchen.BlogApiApplication : Starting BlogApiApplication on mingchendeMac-mini.local with PID 12683 (/Users/mingchen/code/java/other/legalAid/api/target/classes started by mingchen in /Users/mingchen/code/java/other/legalAid) +2025-04-16 13:29:37.841 DEBUG 12683 --- [restartedMain] com.mingchen.BlogApiApplication : Running with Spring Boot v2.2.7.RELEASE, Spring v5.2.6.RELEASE +2025-04-16 13:29:37.841 INFO 12683 --- [restartedMain] com.mingchen.BlogApiApplication : The following profiles are active: dev +2025-04-16 13:29:37.859 INFO 12683 --- [restartedMain] o.s.b.devtools.restart.ChangeableUrls : The Class-Path manifest attribute in /usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/jaxb-runtime-2.3.1.jar referenced one or more files that do not exist: file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/jaxb-api-2.3.1.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/txw2-2.3.1.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/istack-commons-runtime-3.0.7.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/stax-ex-1.8.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/FastInfoset-1.2.15.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/javax.activation-api-1.2.0.jar +2025-04-16 13:29:37.859 INFO 12683 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : Devtools property defaults active! Set 'spring.devtools.add-properties' to 'false' to disable +2025-04-16 13:29:37.859 INFO 12683 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : For additional web related logging consider setting the 'logging.level.web' property to 'DEBUG' +2025-04-16 13:29:38.077 INFO 12683 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Multiple Spring Data modules found, entering strict repository configuration mode! +2025-04-16 13:29:38.078 INFO 12683 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data Redis repositories in DEFAULT mode. +2025-04-16 13:29:38.090 INFO 12683 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 7ms. Found 0 Redis repository interfaces. +2025-04-16 13:29:38.348 INFO 12683 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 9092 (http) +2025-04-16 13:29:38.351 INFO 12683 --- [restartedMain] o.apache.catalina.core.StandardService : Starting service [Tomcat] +2025-04-16 13:29:38.351 INFO 12683 --- [restartedMain] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.34] +2025-04-16 13:29:38.374 INFO 12683 --- [restartedMain] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext +2025-04-16 13:29:38.374 INFO 12683 --- [restartedMain] o.s.web.context.ContextLoader : Root WebApplicationContext: initialization completed in 515 ms +2025-04-16 13:29:38.855 INFO 12683 --- [restartedMain] n.b.p.u.AbstractUserAgentAnalyzerDirect : - Loaded 90 files in 208 msec using expression: classpath*:UserAgents/**/*.yaml +2025-04-16 13:29:38.855 INFO 12683 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : +2025-04-16 13:29:38.856 INFO 12683 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : /-----------------------------------------------------------\ +2025-04-16 13:29:38.856 INFO 12683 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : | Yauaa 5.20 (v5.20 @ 2020-11-22T15:39:16Z) | +2025-04-16 13:29:38.856 INFO 12683 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : +-----------------------------------------------------------+ +2025-04-16 13:29:38.856 INFO 12683 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : | For more information: https://yauaa.basjes.nl | +2025-04-16 13:29:38.856 INFO 12683 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : | Copyright (C) 2013-2020 Niels Basjes - License Apache 2.0 | +2025-04-16 13:29:38.856 INFO 12683 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : \-----------------------------------------------------------/ +2025-04-16 13:29:38.856 INFO 12683 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : +2025-04-16 13:29:38.859 INFO 12683 --- [restartedMain] n.b.p.u.AbstractUserAgentAnalyzerDirect : Building all needed matchers for the requested 11 fields. +2025-04-16 13:29:38.911 INFO 12683 --- [restartedMain] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor' +2025-04-16 13:29:38.998 INFO 12683 --- [restartedMain] org.quartz.impl.StdSchedulerFactory : Using default implementation for ThreadExecutor +2025-04-16 13:29:39.002 INFO 12683 --- [restartedMain] org.quartz.core.SchedulerSignalerImpl : Initialized Scheduler Signaller of type: class org.quartz.core.SchedulerSignalerImpl +2025-04-16 13:29:39.002 INFO 12683 --- [restartedMain] org.quartz.core.QuartzScheduler : Quartz Scheduler v.2.3.2 created. +2025-04-16 13:29:39.002 INFO 12683 --- [restartedMain] org.quartz.simpl.RAMJobStore : RAMJobStore initialized. +2025-04-16 13:29:39.002 INFO 12683 --- [restartedMain] org.quartz.core.QuartzScheduler : Scheduler meta-data: Quartz Scheduler (v2.3.2) 'quartzScheduler' with instanceId 'NON_CLUSTERED' + Scheduler class: 'org.quartz.core.QuartzScheduler' - running locally. + NOT STARTED. + Currently in standby mode. + Number of jobs executed: 0 + Using thread pool 'org.quartz.simpl.SimpleThreadPool' - with 10 threads. + Using job-store 'org.quartz.simpl.RAMJobStore' - which does not support persistence. and is not clustered. + +2025-04-16 13:29:39.002 INFO 12683 --- [restartedMain] org.quartz.impl.StdSchedulerFactory : Quartz scheduler 'quartzScheduler' initialized from an externally provided properties instance. +2025-04-16 13:29:39.002 INFO 12683 --- [restartedMain] org.quartz.impl.StdSchedulerFactory : Quartz scheduler version: 2.3.2 +2025-04-16 13:29:39.002 INFO 12683 --- [restartedMain] org.quartz.core.QuartzScheduler : JobFactory set to: org.springframework.scheduling.quartz.SpringBeanJobFactory@79cd40f1 +2025-04-16 13:29:39.034 INFO 12683 --- [restartedMain] o.s.s.web.DefaultSecurityFilterChain : Creating filter chain: any request, [org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter@3ed66d12, org.springframework.security.web.context.SecurityContextPersistenceFilter@163fbac0, org.springframework.security.web.header.HeaderWriterFilter@72036963, org.springframework.web.filter.CorsFilter@91b7fdc, org.springframework.security.web.authentication.logout.LogoutFilter@16bc6bf2, com.mingchen.common.config.JwtLoginFilter@464743ab, com.mingchen.common.config.JwtFilter@7754a8c1, org.springframework.security.web.savedrequest.RequestCacheAwareFilter@caa222, org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter@5cd54dff, org.springframework.security.web.authentication.AnonymousAuthenticationFilter@7ae7f5c4, org.springframework.security.web.session.SessionManagementFilter@4c69e4d7, org.springframework.security.web.access.ExceptionTranslationFilter@206c5084, org.springframework.security.web.access.intercept.FilterSecurityInterceptor@20bf249] +2025-04-16 13:29:39.046 INFO 12683 --- [restartedMain] o.s.b.d.a.OptionalLiveReloadServer : LiveReload server is running on port 35729 +2025-04-16 13:29:39.053 INFO 12683 --- [restartedMain] o.s.s.quartz.SchedulerFactoryBean : Starting Quartz Scheduler now +2025-04-16 13:29:39.054 INFO 12683 --- [restartedMain] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED started. +2025-04-16 13:29:39.063 INFO 12683 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 9092 (http) with context path '' +2025-04-16 13:29:39.065 INFO 12683 --- [restartedMain] com.mingchen.BlogApiApplication : Started BlogApiApplication in 1.405 seconds (JVM running for 1.691) +2025-04-16 13:29:42.682 INFO 12683 --- [http-nio-9092-exec-2] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet' +2025-04-16 13:29:42.682 INFO 12683 --- [http-nio-9092-exec-2] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet' +2025-04-16 13:29:42.684 INFO 12683 --- [http-nio-9092-exec-2] o.s.web.servlet.DispatcherServlet : Completed initialization in 2 ms +2025-04-16 13:30:04.464 INFO 12683 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED paused. +2025-04-16 13:30:04.465 INFO 12683 --- [SpringContextShutdownHook] o.s.s.quartz.SchedulerFactoryBean : Shutting down Quartz Scheduler +2025-04-16 13:30:04.465 INFO 12683 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED shutting down. +2025-04-16 13:30:04.465 INFO 12683 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED paused. +2025-04-16 13:30:04.465 INFO 12683 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED shutdown complete. +2025-04-16 13:30:04.466 INFO 12683 --- [SpringContextShutdownHook] o.s.s.concurrent.ThreadPoolTaskExecutor : Shutting down ExecutorService 'applicationTaskExecutor' +2025-04-16 13:30:06.832 INFO 12695 --- [restartedMain] com.mingchen.BlogApiApplication : Starting BlogApiApplication on mingchendeMac-mini.local with PID 12695 (/Users/mingchen/code/java/other/legalAid/api/target/classes started by mingchen in /Users/mingchen/code/java/other/legalAid) +2025-04-16 13:30:06.833 DEBUG 12695 --- [restartedMain] com.mingchen.BlogApiApplication : Running with Spring Boot v2.2.7.RELEASE, Spring v5.2.6.RELEASE +2025-04-16 13:30:06.833 INFO 12695 --- [restartedMain] com.mingchen.BlogApiApplication : The following profiles are active: dev +2025-04-16 13:30:06.850 INFO 12695 --- [restartedMain] o.s.b.devtools.restart.ChangeableUrls : The Class-Path manifest attribute in /usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/jaxb-runtime-2.3.1.jar referenced one or more files that do not exist: file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/jaxb-api-2.3.1.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/txw2-2.3.1.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/istack-commons-runtime-3.0.7.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/stax-ex-1.8.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/FastInfoset-1.2.15.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/javax.activation-api-1.2.0.jar +2025-04-16 13:30:06.851 INFO 12695 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : Devtools property defaults active! Set 'spring.devtools.add-properties' to 'false' to disable +2025-04-16 13:30:06.851 INFO 12695 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : For additional web related logging consider setting the 'logging.level.web' property to 'DEBUG' +2025-04-16 13:30:07.055 INFO 12695 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Multiple Spring Data modules found, entering strict repository configuration mode! +2025-04-16 13:30:07.056 INFO 12695 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data Redis repositories in DEFAULT mode. +2025-04-16 13:30:07.067 INFO 12695 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 6ms. Found 0 Redis repository interfaces. +2025-04-16 13:30:07.311 INFO 12695 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 9092 (http) +2025-04-16 13:30:07.314 INFO 12695 --- [restartedMain] o.apache.catalina.core.StandardService : Starting service [Tomcat] +2025-04-16 13:30:07.314 INFO 12695 --- [restartedMain] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.34] +2025-04-16 13:30:07.337 INFO 12695 --- [restartedMain] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext +2025-04-16 13:30:07.338 INFO 12695 --- [restartedMain] o.s.web.context.ContextLoader : Root WebApplicationContext: initialization completed in 487 ms +2025-04-16 13:30:07.799 INFO 12695 --- [restartedMain] n.b.p.u.AbstractUserAgentAnalyzerDirect : - Loaded 90 files in 203 msec using expression: classpath*:UserAgents/**/*.yaml +2025-04-16 13:30:07.800 INFO 12695 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : +2025-04-16 13:30:07.800 INFO 12695 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : /-----------------------------------------------------------\ +2025-04-16 13:30:07.800 INFO 12695 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : | Yauaa 5.20 (v5.20 @ 2020-11-22T15:39:16Z) | +2025-04-16 13:30:07.800 INFO 12695 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : +-----------------------------------------------------------+ +2025-04-16 13:30:07.800 INFO 12695 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : | For more information: https://yauaa.basjes.nl | +2025-04-16 13:30:07.800 INFO 12695 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : | Copyright (C) 2013-2020 Niels Basjes - License Apache 2.0 | +2025-04-16 13:30:07.800 INFO 12695 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : \-----------------------------------------------------------/ +2025-04-16 13:30:07.800 INFO 12695 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : +2025-04-16 13:30:07.804 INFO 12695 --- [restartedMain] n.b.p.u.AbstractUserAgentAnalyzerDirect : Building all needed matchers for the requested 11 fields. +2025-04-16 13:30:07.853 INFO 12695 --- [restartedMain] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor' +2025-04-16 13:30:07.936 INFO 12695 --- [restartedMain] org.quartz.impl.StdSchedulerFactory : Using default implementation for ThreadExecutor +2025-04-16 13:30:07.940 INFO 12695 --- [restartedMain] org.quartz.core.SchedulerSignalerImpl : Initialized Scheduler Signaller of type: class org.quartz.core.SchedulerSignalerImpl +2025-04-16 13:30:07.940 INFO 12695 --- [restartedMain] org.quartz.core.QuartzScheduler : Quartz Scheduler v.2.3.2 created. +2025-04-16 13:30:07.940 INFO 12695 --- [restartedMain] org.quartz.simpl.RAMJobStore : RAMJobStore initialized. +2025-04-16 13:30:07.940 INFO 12695 --- [restartedMain] org.quartz.core.QuartzScheduler : Scheduler meta-data: Quartz Scheduler (v2.3.2) 'quartzScheduler' with instanceId 'NON_CLUSTERED' + Scheduler class: 'org.quartz.core.QuartzScheduler' - running locally. + NOT STARTED. + Currently in standby mode. + Number of jobs executed: 0 + Using thread pool 'org.quartz.simpl.SimpleThreadPool' - with 10 threads. + Using job-store 'org.quartz.simpl.RAMJobStore' - which does not support persistence. and is not clustered. + +2025-04-16 13:30:07.940 INFO 12695 --- [restartedMain] org.quartz.impl.StdSchedulerFactory : Quartz scheduler 'quartzScheduler' initialized from an externally provided properties instance. +2025-04-16 13:30:07.940 INFO 12695 --- [restartedMain] org.quartz.impl.StdSchedulerFactory : Quartz scheduler version: 2.3.2 +2025-04-16 13:30:07.941 INFO 12695 --- [restartedMain] org.quartz.core.QuartzScheduler : JobFactory set to: org.springframework.scheduling.quartz.SpringBeanJobFactory@657169c4 +2025-04-16 13:30:07.971 INFO 12695 --- [restartedMain] o.s.s.web.DefaultSecurityFilterChain : Creating filter chain: any request, [org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter@7323ec88, org.springframework.security.web.context.SecurityContextPersistenceFilter@3943d708, org.springframework.security.web.header.HeaderWriterFilter@26620bc0, org.springframework.web.filter.CorsFilter@4e62a4e7, org.springframework.security.web.authentication.logout.LogoutFilter@30a26112, com.mingchen.common.config.JwtLoginFilter@73b9b713, com.mingchen.common.config.JwtFilter@24913f43, org.springframework.security.web.savedrequest.RequestCacheAwareFilter@37834e5c, org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter@720e3bdd, org.springframework.security.web.authentication.AnonymousAuthenticationFilter@48bac0f5, org.springframework.security.web.session.SessionManagementFilter@3878531a, org.springframework.security.web.access.ExceptionTranslationFilter@5dec1aeb, org.springframework.security.web.access.intercept.FilterSecurityInterceptor@715e6487] +2025-04-16 13:30:07.982 INFO 12695 --- [restartedMain] o.s.b.d.a.OptionalLiveReloadServer : LiveReload server is running on port 35729 +2025-04-16 13:30:07.989 INFO 12695 --- [restartedMain] o.s.s.quartz.SchedulerFactoryBean : Starting Quartz Scheduler now +2025-04-16 13:30:07.989 INFO 12695 --- [restartedMain] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED started. +2025-04-16 13:30:07.998 INFO 12695 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 9092 (http) with context path '' +2025-04-16 13:30:08.000 INFO 12695 --- [restartedMain] com.mingchen.BlogApiApplication : Started BlogApiApplication in 1.337 seconds (JVM running for 1.602) +2025-04-16 13:30:09.877 INFO 12695 --- [http-nio-9092-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet' +2025-04-16 13:30:09.877 INFO 12695 --- [http-nio-9092-exec-1] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet' +2025-04-16 13:30:09.880 INFO 12695 --- [http-nio-9092-exec-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 2 ms +2025-04-16 13:31:23.447 INFO 12695 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED paused. +2025-04-16 13:31:23.448 INFO 12695 --- [SpringContextShutdownHook] o.s.s.quartz.SchedulerFactoryBean : Shutting down Quartz Scheduler +2025-04-16 13:31:23.448 INFO 12695 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED shutting down. +2025-04-16 13:31:23.448 INFO 12695 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED paused. +2025-04-16 13:31:23.448 INFO 12695 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED shutdown complete. +2025-04-16 13:31:23.448 INFO 12695 --- [SpringContextShutdownHook] o.s.s.concurrent.ThreadPoolTaskExecutor : Shutting down ExecutorService 'applicationTaskExecutor' +2025-04-16 13:31:31.743 INFO 12715 --- [restartedMain] com.mingchen.BlogApiApplication : Starting BlogApiApplication on mingchendeMac-mini.local with PID 12715 (/Users/mingchen/code/java/other/legalAid/api/target/classes started by mingchen in /Users/mingchen/code/java/other/legalAid) +2025-04-16 13:31:31.745 DEBUG 12715 --- [restartedMain] com.mingchen.BlogApiApplication : Running with Spring Boot v2.2.7.RELEASE, Spring v5.2.6.RELEASE +2025-04-16 13:31:31.745 INFO 12715 --- [restartedMain] com.mingchen.BlogApiApplication : The following profiles are active: dev +2025-04-16 13:31:31.759 INFO 12715 --- [restartedMain] o.s.b.devtools.restart.ChangeableUrls : The Class-Path manifest attribute in /usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/jaxb-runtime-2.3.1.jar referenced one or more files that do not exist: file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/jaxb-api-2.3.1.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/txw2-2.3.1.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/istack-commons-runtime-3.0.7.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/stax-ex-1.8.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/FastInfoset-1.2.15.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/javax.activation-api-1.2.0.jar +2025-04-16 13:31:31.759 INFO 12715 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : Devtools property defaults active! Set 'spring.devtools.add-properties' to 'false' to disable +2025-04-16 13:31:31.759 INFO 12715 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : For additional web related logging consider setting the 'logging.level.web' property to 'DEBUG' +2025-04-16 13:31:31.938 INFO 12715 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Multiple Spring Data modules found, entering strict repository configuration mode! +2025-04-16 13:31:31.939 INFO 12715 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data Redis repositories in DEFAULT mode. +2025-04-16 13:31:31.949 INFO 12715 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 6ms. Found 0 Redis repository interfaces. +2025-04-16 13:31:32.186 INFO 12715 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 9092 (http) +2025-04-16 13:31:32.190 INFO 12715 --- [restartedMain] o.apache.catalina.core.StandardService : Starting service [Tomcat] +2025-04-16 13:31:32.190 INFO 12715 --- [restartedMain] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.34] +2025-04-16 13:31:32.212 INFO 12715 --- [restartedMain] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext +2025-04-16 13:31:32.212 INFO 12715 --- [restartedMain] o.s.web.context.ContextLoader : Root WebApplicationContext: initialization completed in 453 ms +2025-04-16 13:31:32.662 INFO 12715 --- [restartedMain] n.b.p.u.AbstractUserAgentAnalyzerDirect : - Loaded 90 files in 208 msec using expression: classpath*:UserAgents/**/*.yaml +2025-04-16 13:31:32.662 INFO 12715 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : +2025-04-16 13:31:32.662 INFO 12715 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : /-----------------------------------------------------------\ +2025-04-16 13:31:32.662 INFO 12715 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : | Yauaa 5.20 (v5.20 @ 2020-11-22T15:39:16Z) | +2025-04-16 13:31:32.663 INFO 12715 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : +-----------------------------------------------------------+ +2025-04-16 13:31:32.663 INFO 12715 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : | For more information: https://yauaa.basjes.nl | +2025-04-16 13:31:32.663 INFO 12715 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : | Copyright (C) 2013-2020 Niels Basjes - License Apache 2.0 | +2025-04-16 13:31:32.663 INFO 12715 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : \-----------------------------------------------------------/ +2025-04-16 13:31:32.663 INFO 12715 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : +2025-04-16 13:31:32.665 INFO 12715 --- [restartedMain] n.b.p.u.AbstractUserAgentAnalyzerDirect : Building all needed matchers for the requested 11 fields. +2025-04-16 13:31:32.714 INFO 12715 --- [restartedMain] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor' +2025-04-16 13:31:32.796 INFO 12715 --- [restartedMain] org.quartz.impl.StdSchedulerFactory : Using default implementation for ThreadExecutor +2025-04-16 13:31:32.800 INFO 12715 --- [restartedMain] org.quartz.core.SchedulerSignalerImpl : Initialized Scheduler Signaller of type: class org.quartz.core.SchedulerSignalerImpl +2025-04-16 13:31:32.800 INFO 12715 --- [restartedMain] org.quartz.core.QuartzScheduler : Quartz Scheduler v.2.3.2 created. +2025-04-16 13:31:32.800 INFO 12715 --- [restartedMain] org.quartz.simpl.RAMJobStore : RAMJobStore initialized. +2025-04-16 13:31:32.800 INFO 12715 --- [restartedMain] org.quartz.core.QuartzScheduler : Scheduler meta-data: Quartz Scheduler (v2.3.2) 'quartzScheduler' with instanceId 'NON_CLUSTERED' + Scheduler class: 'org.quartz.core.QuartzScheduler' - running locally. + NOT STARTED. + Currently in standby mode. + Number of jobs executed: 0 + Using thread pool 'org.quartz.simpl.SimpleThreadPool' - with 10 threads. + Using job-store 'org.quartz.simpl.RAMJobStore' - which does not support persistence. and is not clustered. + +2025-04-16 13:31:32.800 INFO 12715 --- [restartedMain] org.quartz.impl.StdSchedulerFactory : Quartz scheduler 'quartzScheduler' initialized from an externally provided properties instance. +2025-04-16 13:31:32.800 INFO 12715 --- [restartedMain] org.quartz.impl.StdSchedulerFactory : Quartz scheduler version: 2.3.2 +2025-04-16 13:31:32.800 INFO 12715 --- [restartedMain] org.quartz.core.QuartzScheduler : JobFactory set to: org.springframework.scheduling.quartz.SpringBeanJobFactory@506c744d +2025-04-16 13:31:32.834 INFO 12715 --- [restartedMain] o.s.s.web.DefaultSecurityFilterChain : Creating filter chain: any request, [org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter@15288110, org.springframework.security.web.context.SecurityContextPersistenceFilter@54eb04bb, org.springframework.security.web.header.HeaderWriterFilter@1ef11f58, org.springframework.web.filter.CorsFilter@137f5c69, org.springframework.security.web.authentication.logout.LogoutFilter@2d59449d, com.mingchen.common.config.JwtLoginFilter@f7cf7ed, com.mingchen.common.config.JwtFilter@16c2b0c9, org.springframework.security.web.savedrequest.RequestCacheAwareFilter@51e670b0, org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter@72c7da69, org.springframework.security.web.authentication.AnonymousAuthenticationFilter@47339300, org.springframework.security.web.session.SessionManagementFilter@5f3e80bd, org.springframework.security.web.access.ExceptionTranslationFilter@412d7046, org.springframework.security.web.access.intercept.FilterSecurityInterceptor@dc8f2ec] +2025-04-16 13:31:32.847 INFO 12715 --- [restartedMain] o.s.b.d.a.OptionalLiveReloadServer : LiveReload server is running on port 35729 +2025-04-16 13:31:32.855 INFO 12715 --- [restartedMain] o.s.s.quartz.SchedulerFactoryBean : Starting Quartz Scheduler now +2025-04-16 13:31:32.856 INFO 12715 --- [restartedMain] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED started. +2025-04-16 13:31:32.866 INFO 12715 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 9092 (http) with context path '' +2025-04-16 13:31:32.868 INFO 12715 --- [restartedMain] com.mingchen.BlogApiApplication : Started BlogApiApplication in 1.266 seconds (JVM running for 1.511) +2025-04-16 13:31:37.415 INFO 12715 --- [http-nio-9092-exec-2] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet' +2025-04-16 13:31:37.416 INFO 12715 --- [http-nio-9092-exec-2] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet' +2025-04-16 13:31:37.420 INFO 12715 --- [http-nio-9092-exec-2] o.s.web.servlet.DispatcherServlet : Completed initialization in 4 ms +2025-04-16 13:57:09.892 INFO 12715 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED paused. +2025-04-16 13:57:09.894 INFO 12715 --- [SpringContextShutdownHook] o.s.s.quartz.SchedulerFactoryBean : Shutting down Quartz Scheduler +2025-04-16 13:57:09.899 INFO 12715 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED shutting down. +2025-04-16 13:57:09.899 INFO 12715 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED paused. +2025-04-16 13:57:09.899 INFO 12715 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED shutdown complete. +2025-04-16 13:57:09.899 INFO 12715 --- [SpringContextShutdownHook] o.s.s.concurrent.ThreadPoolTaskExecutor : Shutting down ExecutorService 'applicationTaskExecutor' +2025-04-16 13:57:12.140 INFO 13079 --- [restartedMain] com.mingchen.BlogApiApplication : Starting BlogApiApplication on mingchendeMac-mini.local with PID 13079 (/Users/mingchen/code/java/other/legalAid/api/target/classes started by mingchen in /Users/mingchen/code/java/other/legalAid) +2025-04-16 13:57:12.141 DEBUG 13079 --- [restartedMain] com.mingchen.BlogApiApplication : Running with Spring Boot v2.2.7.RELEASE, Spring v5.2.6.RELEASE +2025-04-16 13:57:12.141 INFO 13079 --- [restartedMain] com.mingchen.BlogApiApplication : The following profiles are active: dev +2025-04-16 13:57:12.156 INFO 13079 --- [restartedMain] o.s.b.devtools.restart.ChangeableUrls : The Class-Path manifest attribute in /usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/jaxb-runtime-2.3.1.jar referenced one or more files that do not exist: file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/jaxb-api-2.3.1.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/txw2-2.3.1.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/istack-commons-runtime-3.0.7.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/stax-ex-1.8.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/FastInfoset-1.2.15.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/javax.activation-api-1.2.0.jar +2025-04-16 13:57:12.156 INFO 13079 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : Devtools property defaults active! Set 'spring.devtools.add-properties' to 'false' to disable +2025-04-16 13:57:12.156 INFO 13079 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : For additional web related logging consider setting the 'logging.level.web' property to 'DEBUG' +2025-04-16 13:57:12.355 INFO 13079 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Multiple Spring Data modules found, entering strict repository configuration mode! +2025-04-16 13:57:12.355 INFO 13079 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data Redis repositories in DEFAULT mode. +2025-04-16 13:57:12.366 INFO 13079 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 6ms. Found 0 Redis repository interfaces. +2025-04-16 13:57:12.606 INFO 13079 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 9092 (http) +2025-04-16 13:57:12.609 INFO 13079 --- [restartedMain] o.apache.catalina.core.StandardService : Starting service [Tomcat] +2025-04-16 13:57:12.609 INFO 13079 --- [restartedMain] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.34] +2025-04-16 13:57:12.631 INFO 13079 --- [restartedMain] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext +2025-04-16 13:57:12.631 INFO 13079 --- [restartedMain] o.s.web.context.ContextLoader : Root WebApplicationContext: initialization completed in 474 ms +2025-04-16 13:57:13.095 INFO 13079 --- [restartedMain] n.b.p.u.AbstractUserAgentAnalyzerDirect : - Loaded 90 files in 213 msec using expression: classpath*:UserAgents/**/*.yaml +2025-04-16 13:57:13.095 INFO 13079 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : +2025-04-16 13:57:13.095 INFO 13079 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : /-----------------------------------------------------------\ +2025-04-16 13:57:13.095 INFO 13079 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : | Yauaa 5.20 (v5.20 @ 2020-11-22T15:39:16Z) | +2025-04-16 13:57:13.095 INFO 13079 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : +-----------------------------------------------------------+ +2025-04-16 13:57:13.095 INFO 13079 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : | For more information: https://yauaa.basjes.nl | +2025-04-16 13:57:13.095 INFO 13079 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : | Copyright (C) 2013-2020 Niels Basjes - License Apache 2.0 | +2025-04-16 13:57:13.095 INFO 13079 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : \-----------------------------------------------------------/ +2025-04-16 13:57:13.095 INFO 13079 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : +2025-04-16 13:57:13.099 INFO 13079 --- [restartedMain] n.b.p.u.AbstractUserAgentAnalyzerDirect : Building all needed matchers for the requested 11 fields. +2025-04-16 13:57:13.147 INFO 13079 --- [restartedMain] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor' +2025-04-16 13:57:13.223 INFO 13079 --- [restartedMain] org.quartz.impl.StdSchedulerFactory : Using default implementation for ThreadExecutor +2025-04-16 13:57:13.227 INFO 13079 --- [restartedMain] org.quartz.core.SchedulerSignalerImpl : Initialized Scheduler Signaller of type: class org.quartz.core.SchedulerSignalerImpl +2025-04-16 13:57:13.227 INFO 13079 --- [restartedMain] org.quartz.core.QuartzScheduler : Quartz Scheduler v.2.3.2 created. +2025-04-16 13:57:13.227 INFO 13079 --- [restartedMain] org.quartz.simpl.RAMJobStore : RAMJobStore initialized. +2025-04-16 13:57:13.228 INFO 13079 --- [restartedMain] org.quartz.core.QuartzScheduler : Scheduler meta-data: Quartz Scheduler (v2.3.2) 'quartzScheduler' with instanceId 'NON_CLUSTERED' + Scheduler class: 'org.quartz.core.QuartzScheduler' - running locally. + NOT STARTED. + Currently in standby mode. + Number of jobs executed: 0 + Using thread pool 'org.quartz.simpl.SimpleThreadPool' - with 10 threads. + Using job-store 'org.quartz.simpl.RAMJobStore' - which does not support persistence. and is not clustered. + +2025-04-16 13:57:13.228 INFO 13079 --- [restartedMain] org.quartz.impl.StdSchedulerFactory : Quartz scheduler 'quartzScheduler' initialized from an externally provided properties instance. +2025-04-16 13:57:13.228 INFO 13079 --- [restartedMain] org.quartz.impl.StdSchedulerFactory : Quartz scheduler version: 2.3.2 +2025-04-16 13:57:13.228 INFO 13079 --- [restartedMain] org.quartz.core.QuartzScheduler : JobFactory set to: org.springframework.scheduling.quartz.SpringBeanJobFactory@2d6fd78b +2025-04-16 13:57:13.258 INFO 13079 --- [restartedMain] o.s.s.web.DefaultSecurityFilterChain : Creating filter chain: any request, [org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter@109a0095, org.springframework.security.web.context.SecurityContextPersistenceFilter@5e2094ac, org.springframework.security.web.header.HeaderWriterFilter@7b3426b6, org.springframework.web.filter.CorsFilter@1f4f5db4, org.springframework.security.web.authentication.logout.LogoutFilter@3980ce41, com.mingchen.common.config.JwtLoginFilter@1bf4d584, com.mingchen.common.config.JwtFilter@7636f148, org.springframework.security.web.savedrequest.RequestCacheAwareFilter@673bebb7, org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter@5603bd57, org.springframework.security.web.authentication.AnonymousAuthenticationFilter@3668c9b3, org.springframework.security.web.session.SessionManagementFilter@3e30dc9e, org.springframework.security.web.access.ExceptionTranslationFilter@3b39c0af, org.springframework.security.web.access.intercept.FilterSecurityInterceptor@14205f26] +2025-04-16 13:57:13.268 INFO 13079 --- [restartedMain] o.s.b.d.a.OptionalLiveReloadServer : LiveReload server is running on port 35729 +2025-04-16 13:57:13.276 INFO 13079 --- [restartedMain] o.s.s.quartz.SchedulerFactoryBean : Starting Quartz Scheduler now +2025-04-16 13:57:13.276 INFO 13079 --- [restartedMain] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED started. +2025-04-16 13:57:13.284 INFO 13079 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 9092 (http) with context path '' +2025-04-16 13:57:13.286 INFO 13079 --- [restartedMain] com.mingchen.BlogApiApplication : Started BlogApiApplication in 1.293 seconds (JVM running for 1.515) +2025-04-16 13:57:32.314 INFO 13079 --- [http-nio-9092-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet' +2025-04-16 13:57:32.314 INFO 13079 --- [http-nio-9092-exec-1] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet' +2025-04-16 13:57:32.319 INFO 13079 --- [http-nio-9092-exec-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 5 ms +2025-04-16 17:52:36.298 INFO 13079 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED paused. +2025-04-16 17:52:36.300 INFO 13079 --- [SpringContextShutdownHook] o.s.s.quartz.SchedulerFactoryBean : Shutting down Quartz Scheduler +2025-04-16 17:52:36.301 INFO 13079 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED shutting down. +2025-04-16 17:52:36.301 INFO 13079 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED paused. +2025-04-16 17:52:36.301 INFO 13079 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED shutdown complete. +2025-04-16 17:52:36.301 INFO 13079 --- [SpringContextShutdownHook] o.s.s.concurrent.ThreadPoolTaskExecutor : Shutting down ExecutorService 'applicationTaskExecutor' diff --git a/log/blog-dev/spring.log-2025-04-17-0.log b/log/blog-dev/spring.log-2025-04-17-0.log new file mode 100644 index 0000000..956a205 --- /dev/null +++ b/log/blog-dev/spring.log-2025-04-17-0.log @@ -0,0 +1,6946 @@ +2025-04-17 09:11:19.859 INFO 3606 --- [restartedMain] com.mingchen.BlogApiApplication : Starting BlogApiApplication on mingchendeMac-mini.local with PID 3606 (/Users/mingchen/code/java/other/legalAid/api/target/classes started by mingchen in /Users/mingchen/code/java/other/legalAid) +2025-04-17 09:11:19.860 DEBUG 3606 --- [restartedMain] com.mingchen.BlogApiApplication : Running with Spring Boot v2.2.7.RELEASE, Spring v5.2.6.RELEASE +2025-04-17 09:11:19.860 INFO 3606 --- [restartedMain] com.mingchen.BlogApiApplication : The following profiles are active: dev +2025-04-17 09:11:19.876 INFO 3606 --- [restartedMain] o.s.b.devtools.restart.ChangeableUrls : The Class-Path manifest attribute in /usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/jaxb-runtime-2.3.1.jar referenced one or more files that do not exist: file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/jaxb-api-2.3.1.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/txw2-2.3.1.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/istack-commons-runtime-3.0.7.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/stax-ex-1.8.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/FastInfoset-1.2.15.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/javax.activation-api-1.2.0.jar +2025-04-17 09:11:19.877 INFO 3606 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : Devtools property defaults active! Set 'spring.devtools.add-properties' to 'false' to disable +2025-04-17 09:11:19.877 INFO 3606 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : For additional web related logging consider setting the 'logging.level.web' property to 'DEBUG' +2025-04-17 09:11:20.137 INFO 3606 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Multiple Spring Data modules found, entering strict repository configuration mode! +2025-04-17 09:11:20.138 INFO 3606 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data Redis repositories in DEFAULT mode. +2025-04-17 09:11:20.152 INFO 3606 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 7ms. Found 0 Redis repository interfaces. +2025-04-17 09:11:20.418 INFO 3606 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 9092 (http) +2025-04-17 09:11:20.422 INFO 3606 --- [restartedMain] o.apache.catalina.core.StandardService : Starting service [Tomcat] +2025-04-17 09:11:20.422 INFO 3606 --- [restartedMain] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.34] +2025-04-17 09:11:20.445 INFO 3606 --- [restartedMain] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext +2025-04-17 09:11:20.445 INFO 3606 --- [restartedMain] o.s.web.context.ContextLoader : Root WebApplicationContext: initialization completed in 568 ms +2025-04-17 09:11:20.987 INFO 3606 --- [restartedMain] n.b.p.u.AbstractUserAgentAnalyzerDirect : - Loaded 90 files in 211 msec using expression: classpath*:UserAgents/**/*.yaml +2025-04-17 09:11:20.988 INFO 3606 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : +2025-04-17 09:11:20.988 INFO 3606 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : /-----------------------------------------------------------\ +2025-04-17 09:11:20.988 INFO 3606 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : | Yauaa 5.20 (v5.20 @ 2020-11-22T15:39:16Z) | +2025-04-17 09:11:20.988 INFO 3606 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : +-----------------------------------------------------------+ +2025-04-17 09:11:20.988 INFO 3606 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : | For more information: https://yauaa.basjes.nl | +2025-04-17 09:11:20.988 INFO 3606 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : | Copyright (C) 2013-2020 Niels Basjes - License Apache 2.0 | +2025-04-17 09:11:20.988 INFO 3606 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : \-----------------------------------------------------------/ +2025-04-17 09:11:20.988 INFO 3606 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : +2025-04-17 09:11:20.998 INFO 3606 --- [restartedMain] n.b.p.u.AbstractUserAgentAnalyzerDirect : Building all needed matchers for the requested 11 fields. +2025-04-17 09:11:21.075 INFO 3606 --- [restartedMain] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor' +2025-04-17 09:11:21.179 INFO 3606 --- [restartedMain] org.quartz.impl.StdSchedulerFactory : Using default implementation for ThreadExecutor +2025-04-17 09:11:21.184 INFO 3606 --- [restartedMain] org.quartz.core.SchedulerSignalerImpl : Initialized Scheduler Signaller of type: class org.quartz.core.SchedulerSignalerImpl +2025-04-17 09:11:21.184 INFO 3606 --- [restartedMain] org.quartz.core.QuartzScheduler : Quartz Scheduler v.2.3.2 created. +2025-04-17 09:11:21.184 INFO 3606 --- [restartedMain] org.quartz.simpl.RAMJobStore : RAMJobStore initialized. +2025-04-17 09:11:21.184 INFO 3606 --- [restartedMain] org.quartz.core.QuartzScheduler : Scheduler meta-data: Quartz Scheduler (v2.3.2) 'quartzScheduler' with instanceId 'NON_CLUSTERED' + Scheduler class: 'org.quartz.core.QuartzScheduler' - running locally. + NOT STARTED. + Currently in standby mode. + Number of jobs executed: 0 + Using thread pool 'org.quartz.simpl.SimpleThreadPool' - with 10 threads. + Using job-store 'org.quartz.simpl.RAMJobStore' - which does not support persistence. and is not clustered. + +2025-04-17 09:11:21.184 INFO 3606 --- [restartedMain] org.quartz.impl.StdSchedulerFactory : Quartz scheduler 'quartzScheduler' initialized from an externally provided properties instance. +2025-04-17 09:11:21.184 INFO 3606 --- [restartedMain] org.quartz.impl.StdSchedulerFactory : Quartz scheduler version: 2.3.2 +2025-04-17 09:11:21.185 INFO 3606 --- [restartedMain] org.quartz.core.QuartzScheduler : JobFactory set to: org.springframework.scheduling.quartz.SpringBeanJobFactory@786b297e +2025-04-17 09:11:21.238 INFO 3606 --- [restartedMain] o.s.s.web.DefaultSecurityFilterChain : Creating filter chain: any request, [org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter@1d987a0f, org.springframework.security.web.context.SecurityContextPersistenceFilter@4f48f596, org.springframework.security.web.header.HeaderWriterFilter@3e2ab386, org.springframework.web.filter.CorsFilter@5b6bebb0, org.springframework.security.web.authentication.logout.LogoutFilter@707994d3, com.mingchen.common.config.JwtLoginFilter@6b94d68, com.mingchen.common.config.JwtFilter@19b51222, org.springframework.security.web.savedrequest.RequestCacheAwareFilter@186fda07, org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter@6ffbbeef, org.springframework.security.web.authentication.AnonymousAuthenticationFilter@47a35b19, org.springframework.security.web.session.SessionManagementFilter@2a0c1b20, org.springframework.security.web.access.ExceptionTranslationFilter@dd8c011, org.springframework.security.web.access.intercept.FilterSecurityInterceptor@75abd974] +2025-04-17 09:11:21.262 INFO 3606 --- [restartedMain] o.s.b.d.a.OptionalLiveReloadServer : LiveReload server is running on port 35729 +2025-04-17 09:11:21.275 INFO 3606 --- [restartedMain] o.s.s.quartz.SchedulerFactoryBean : Starting Quartz Scheduler now +2025-04-17 09:11:21.276 INFO 3606 --- [restartedMain] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED started. +2025-04-17 09:11:21.296 INFO 3606 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 9092 (http) with context path '' +2025-04-17 09:11:21.299 INFO 3606 --- [restartedMain] com.mingchen.BlogApiApplication : Started BlogApiApplication in 1.571 seconds (JVM running for 2.207) +2025-04-17 09:38:54.364 INFO 3606 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED paused. +2025-04-17 09:38:54.366 INFO 3606 --- [SpringContextShutdownHook] o.s.s.quartz.SchedulerFactoryBean : Shutting down Quartz Scheduler +2025-04-17 09:38:54.366 INFO 3606 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED shutting down. +2025-04-17 09:38:54.366 INFO 3606 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED paused. +2025-04-17 09:38:54.366 INFO 3606 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED shutdown complete. +2025-04-17 09:38:54.366 INFO 3606 --- [SpringContextShutdownHook] o.s.s.concurrent.ThreadPoolTaskExecutor : Shutting down ExecutorService 'applicationTaskExecutor' +2025-04-17 09:43:03.795 INFO 5471 --- [restartedMain] com.mingchen.BlogApiApplication : Starting BlogApiApplication on mingchendeMac-mini.local with PID 5471 (/Users/mingchen/code/java/other/legalAid/api/target/classes started by mingchen in /Users/mingchen/code/java/other/legalAid) +2025-04-17 09:43:03.796 DEBUG 5471 --- [restartedMain] com.mingchen.BlogApiApplication : Running with Spring Boot v2.2.7.RELEASE, Spring v5.2.6.RELEASE +2025-04-17 09:43:03.796 INFO 5471 --- [restartedMain] com.mingchen.BlogApiApplication : The following profiles are active: dev +2025-04-17 09:43:03.812 INFO 5471 --- [restartedMain] o.s.b.devtools.restart.ChangeableUrls : The Class-Path manifest attribute in /usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/jaxb-runtime-2.3.1.jar referenced one or more files that do not exist: file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/jaxb-api-2.3.1.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/txw2-2.3.1.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/istack-commons-runtime-3.0.7.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/stax-ex-1.8.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/FastInfoset-1.2.15.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/javax.activation-api-1.2.0.jar +2025-04-17 09:43:03.812 INFO 5471 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : Devtools property defaults active! Set 'spring.devtools.add-properties' to 'false' to disable +2025-04-17 09:43:03.812 INFO 5471 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : For additional web related logging consider setting the 'logging.level.web' property to 'DEBUG' +2025-04-17 09:43:04.004 INFO 5471 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Multiple Spring Data modules found, entering strict repository configuration mode! +2025-04-17 09:43:04.005 INFO 5471 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data Redis repositories in DEFAULT mode. +2025-04-17 09:43:04.017 INFO 5471 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 7ms. Found 0 Redis repository interfaces. +2025-04-17 09:43:04.263 INFO 5471 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 9092 (http) +2025-04-17 09:43:04.266 INFO 5471 --- [restartedMain] o.apache.catalina.core.StandardService : Starting service [Tomcat] +2025-04-17 09:43:04.267 INFO 5471 --- [restartedMain] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.34] +2025-04-17 09:43:04.290 INFO 5471 --- [restartedMain] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext +2025-04-17 09:43:04.290 INFO 5471 --- [restartedMain] o.s.web.context.ContextLoader : Root WebApplicationContext: initialization completed in 478 ms +2025-04-17 09:43:04.387 ERROR 5471 --- [restartedMain] c.b.m.core.MybatisConfiguration : mapper[com.mingchen.mapper.CategoriesMapper.getAllCategoriesWithLaws] is ignored, because it exists, maybe from xml file +2025-04-17 09:43:04.811 INFO 5471 --- [restartedMain] n.b.p.u.AbstractUserAgentAnalyzerDirect : - Loaded 90 files in 218 msec using expression: classpath*:UserAgents/**/*.yaml +2025-04-17 09:43:04.811 INFO 5471 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : +2025-04-17 09:43:04.811 INFO 5471 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : /-----------------------------------------------------------\ +2025-04-17 09:43:04.811 INFO 5471 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : | Yauaa 5.20 (v5.20 @ 2020-11-22T15:39:16Z) | +2025-04-17 09:43:04.811 INFO 5471 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : +-----------------------------------------------------------+ +2025-04-17 09:43:04.811 INFO 5471 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : | For more information: https://yauaa.basjes.nl | +2025-04-17 09:43:04.811 INFO 5471 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : | Copyright (C) 2013-2020 Niels Basjes - License Apache 2.0 | +2025-04-17 09:43:04.811 INFO 5471 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : \-----------------------------------------------------------/ +2025-04-17 09:43:04.811 INFO 5471 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : +2025-04-17 09:43:04.816 INFO 5471 --- [restartedMain] n.b.p.u.AbstractUserAgentAnalyzerDirect : Building all needed matchers for the requested 11 fields. +2025-04-17 09:43:04.886 INFO 5471 --- [restartedMain] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor' +2025-04-17 09:43:04.985 INFO 5471 --- [restartedMain] org.quartz.impl.StdSchedulerFactory : Using default implementation for ThreadExecutor +2025-04-17 09:43:04.990 INFO 5471 --- [restartedMain] org.quartz.core.SchedulerSignalerImpl : Initialized Scheduler Signaller of type: class org.quartz.core.SchedulerSignalerImpl +2025-04-17 09:43:04.990 INFO 5471 --- [restartedMain] org.quartz.core.QuartzScheduler : Quartz Scheduler v.2.3.2 created. +2025-04-17 09:43:04.990 INFO 5471 --- [restartedMain] org.quartz.simpl.RAMJobStore : RAMJobStore initialized. +2025-04-17 09:43:04.990 INFO 5471 --- [restartedMain] org.quartz.core.QuartzScheduler : Scheduler meta-data: Quartz Scheduler (v2.3.2) 'quartzScheduler' with instanceId 'NON_CLUSTERED' + Scheduler class: 'org.quartz.core.QuartzScheduler' - running locally. + NOT STARTED. + Currently in standby mode. + Number of jobs executed: 0 + Using thread pool 'org.quartz.simpl.SimpleThreadPool' - with 10 threads. + Using job-store 'org.quartz.simpl.RAMJobStore' - which does not support persistence. and is not clustered. + +2025-04-17 09:43:04.990 INFO 5471 --- [restartedMain] org.quartz.impl.StdSchedulerFactory : Quartz scheduler 'quartzScheduler' initialized from an externally provided properties instance. +2025-04-17 09:43:04.990 INFO 5471 --- [restartedMain] org.quartz.impl.StdSchedulerFactory : Quartz scheduler version: 2.3.2 +2025-04-17 09:43:04.990 INFO 5471 --- [restartedMain] org.quartz.core.QuartzScheduler : JobFactory set to: org.springframework.scheduling.quartz.SpringBeanJobFactory@320bb62 +2025-04-17 09:43:05.028 INFO 5471 --- [restartedMain] o.s.s.web.DefaultSecurityFilterChain : Creating filter chain: any request, [org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter@21096fd9, org.springframework.security.web.context.SecurityContextPersistenceFilter@233db861, org.springframework.security.web.header.HeaderWriterFilter@51fb7763, org.springframework.web.filter.CorsFilter@328c0fbc, org.springframework.security.web.authentication.logout.LogoutFilter@7dad18e4, com.mingchen.common.config.JwtLoginFilter@280be645, com.mingchen.common.config.JwtFilter@749a48c7, org.springframework.security.web.savedrequest.RequestCacheAwareFilter@74fa7078, org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter@486ec271, org.springframework.security.web.authentication.AnonymousAuthenticationFilter@1e87862a, org.springframework.security.web.session.SessionManagementFilter@6986b9c5, org.springframework.security.web.access.ExceptionTranslationFilter@4dced504, org.springframework.security.web.access.intercept.FilterSecurityInterceptor@75636e60] +2025-04-17 09:43:05.041 INFO 5471 --- [restartedMain] o.s.b.d.a.OptionalLiveReloadServer : LiveReload server is running on port 35729 +2025-04-17 09:43:05.050 INFO 5471 --- [restartedMain] o.s.s.quartz.SchedulerFactoryBean : Starting Quartz Scheduler now +2025-04-17 09:43:05.050 INFO 5471 --- [restartedMain] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED started. +2025-04-17 09:43:05.061 INFO 5471 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 9092 (http) with context path '' +2025-04-17 09:43:05.064 INFO 5471 --- [restartedMain] com.mingchen.BlogApiApplication : Started BlogApiApplication in 1.459 seconds (JVM running for 1.745) +2025-04-17 09:43:07.523 INFO 5471 --- [http-nio-9092-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet' +2025-04-17 09:43:07.523 INFO 5471 --- [http-nio-9092-exec-1] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet' +2025-04-17 09:43:07.525 INFO 5471 --- [http-nio-9092-exec-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 2 ms +2025-04-17 09:43:07.532 DEBUG 5471 --- [http-nio-9092-exec-1] c.mingchen.common.config.JwtLoginFilter : Request is to process authentication +2025-04-17 09:43:07.580 INFO 5471 --- [http-nio-9092-exec-1] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting... +2025-04-17 09:43:08.077 INFO 5471 --- [http-nio-9092-exec-1] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed. +2025-04-17 09:43:08.087 DEBUG 5471 --- [http-nio-9092-exec-1] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-17 09:43:08.112 DEBUG 5471 --- [http-nio-9092-exec-1] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-17 09:43:08.172 DEBUG 5471 --- [http-nio-9092-exec-1] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-17 09:43:32.643 DEBUG 5471 --- [http-nio-9092-exec-3] c.mingchen.common.config.JwtLoginFilter : Request is to process authentication +2025-04-17 09:43:32.692 DEBUG 5471 --- [http-nio-9092-exec-3] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-17 09:43:32.694 DEBUG 5471 --- [http-nio-9092-exec-3] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-17 09:43:32.753 DEBUG 5471 --- [http-nio-9092-exec-3] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-17 09:43:57.633 DEBUG 5471 --- [http-nio-9092-exec-4] c.m.m.C.getAllCategoriesWithLaws : ==> Preparing: SELECT c.category_id, c.name, c.description, l.law_id, l.category_id AS law_category_id, l.title, l.summary, l.content, l.effective_date, l.reference_url FROM categories c LEFT JOIN laws l ON c.category_id = l.category_id ORDER BY c.category_id, l.law_id +2025-04-17 09:43:57.635 DEBUG 5471 --- [http-nio-9092-exec-4] c.m.m.C.getAllCategoriesWithLaws : ==> Parameters: +2025-04-17 09:43:57.702 DEBUG 5471 --- [http-nio-9092-exec-4] c.m.m.C.getAllCategoriesWithLaws : <== Total: 5 +2025-04-17 09:55:02.360 DEBUG 5471 --- [http-nio-9092-exec-7] c.m.m.C.getAllCategoriesWithLaws : ==> Preparing: SELECT c.category_id, c.name, c.description, l.law_id, l.category_id AS law_category_id, l.title, l.summary, l.content, l.effective_date, l.reference_url FROM categories c LEFT JOIN laws l ON c.category_id = l.category_id ORDER BY c.category_id, l.law_id +2025-04-17 09:55:02.360 DEBUG 5471 --- [http-nio-9092-exec-7] c.m.m.C.getAllCategoriesWithLaws : ==> Parameters: +2025-04-17 09:55:02.407 DEBUG 5471 --- [http-nio-9092-exec-7] c.m.m.C.getAllCategoriesWithLaws : <== Total: 5 +2025-04-17 09:55:31.420 DEBUG 5471 --- [http-nio-9092-exec-8] c.m.m.C.getAllCategoriesWithLaws : ==> Preparing: SELECT c.category_id, c.name, c.description, l.law_id, l.category_id AS law_category_id, l.title, l.summary, l.content, l.effective_date, l.reference_url FROM categories c LEFT JOIN laws l ON c.category_id = l.category_id ORDER BY c.category_id, l.law_id +2025-04-17 09:55:31.421 DEBUG 5471 --- [http-nio-9092-exec-8] c.m.m.C.getAllCategoriesWithLaws : ==> Parameters: +2025-04-17 09:55:31.500 DEBUG 5471 --- [http-nio-9092-exec-8] c.m.m.C.getAllCategoriesWithLaws : <== Total: 5 +2025-04-17 09:55:34.582 DEBUG 5471 --- [http-nio-9092-exec-9] c.m.m.C.getAllCategoriesWithLaws : ==> Preparing: SELECT c.category_id, c.name, c.description, l.law_id, l.category_id AS law_category_id, l.title, l.summary, l.content, l.effective_date, l.reference_url FROM categories c LEFT JOIN laws l ON c.category_id = l.category_id ORDER BY c.category_id, l.law_id +2025-04-17 09:55:34.583 DEBUG 5471 --- [http-nio-9092-exec-9] c.m.m.C.getAllCategoriesWithLaws : ==> Parameters: +2025-04-17 09:55:34.645 DEBUG 5471 --- [http-nio-9092-exec-9] c.m.m.C.getAllCategoriesWithLaws : <== Total: 5 +2025-04-17 09:55:48.964 DEBUG 5471 --- [http-nio-9092-exec-10] c.m.m.C.getAllCategoriesWithLaws : ==> Preparing: SELECT c.category_id, c.name, c.description, l.law_id, l.category_id AS law_category_id, l.title, l.summary, l.content, l.effective_date, l.reference_url FROM categories c LEFT JOIN laws l ON c.category_id = l.category_id ORDER BY c.category_id, l.law_id +2025-04-17 09:55:48.965 DEBUG 5471 --- [http-nio-9092-exec-10] c.m.m.C.getAllCategoriesWithLaws : ==> Parameters: +2025-04-17 09:55:49.023 DEBUG 5471 --- [http-nio-9092-exec-10] c.m.m.C.getAllCategoriesWithLaws : <== Total: 5 +2025-04-17 10:01:58.320 DEBUG 5471 --- [http-nio-9092-exec-1] c.m.m.C.getAllCategoriesWithLaws : ==> Preparing: SELECT c.category_id, c.name, c.description, l.law_id, l.category_id AS law_category_id, l.title, l.summary, l.content, l.effective_date, l.reference_url FROM categories c LEFT JOIN laws l ON c.category_id = l.category_id ORDER BY c.category_id, l.law_id +2025-04-17 10:01:58.322 DEBUG 5471 --- [http-nio-9092-exec-1] c.m.m.C.getAllCategoriesWithLaws : ==> Parameters: +2025-04-17 10:01:58.375 DEBUG 5471 --- [http-nio-9092-exec-1] c.m.m.C.getAllCategoriesWithLaws : <== Total: 5 +2025-04-17 10:12:38.293 WARN 5471 --- [HikariPool-1 housekeeper] com.zaxxer.hikari.pool.HikariPool : HikariPool-1 - Retrograde clock change detected (housekeeper delta=29s871ms), soft-evicting connections from pool. +2025-04-17 10:33:37.806 INFO 5471 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED paused. +2025-04-17 10:33:37.808 INFO 5471 --- [SpringContextShutdownHook] o.s.s.quartz.SchedulerFactoryBean : Shutting down Quartz Scheduler +2025-04-17 10:33:37.808 INFO 5471 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED shutting down. +2025-04-17 10:33:37.808 INFO 5471 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED paused. +2025-04-17 10:33:37.808 INFO 5471 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED shutdown complete. +2025-04-17 10:33:37.809 INFO 5471 --- [SpringContextShutdownHook] o.s.s.concurrent.ThreadPoolTaskExecutor : Shutting down ExecutorService 'applicationTaskExecutor' +2025-04-17 10:33:37.816 INFO 5471 --- [SpringContextShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown initiated... +2025-04-17 10:33:37.817 INFO 5471 --- [SpringContextShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown completed. +2025-04-17 10:33:40.424 INFO 8125 --- [restartedMain] com.mingchen.BlogApiApplication : Starting BlogApiApplication on mingchendeMac-mini.local with PID 8125 (/Users/mingchen/code/java/other/legalAid/api/target/classes started by mingchen in /Users/mingchen/code/java/other/legalAid) +2025-04-17 10:33:40.425 DEBUG 8125 --- [restartedMain] com.mingchen.BlogApiApplication : Running with Spring Boot v2.2.7.RELEASE, Spring v5.2.6.RELEASE +2025-04-17 10:33:40.425 INFO 8125 --- [restartedMain] com.mingchen.BlogApiApplication : The following profiles are active: dev +2025-04-17 10:33:40.443 INFO 8125 --- [restartedMain] o.s.b.devtools.restart.ChangeableUrls : The Class-Path manifest attribute in /usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/jaxb-runtime-2.3.1.jar referenced one or more files that do not exist: file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/jaxb-api-2.3.1.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/txw2-2.3.1.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/istack-commons-runtime-3.0.7.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/stax-ex-1.8.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/FastInfoset-1.2.15.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/javax.activation-api-1.2.0.jar +2025-04-17 10:33:40.443 INFO 8125 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : Devtools property defaults active! Set 'spring.devtools.add-properties' to 'false' to disable +2025-04-17 10:33:40.443 INFO 8125 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : For additional web related logging consider setting the 'logging.level.web' property to 'DEBUG' +2025-04-17 10:33:40.667 INFO 8125 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Multiple Spring Data modules found, entering strict repository configuration mode! +2025-04-17 10:33:40.668 INFO 8125 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data Redis repositories in DEFAULT mode. +2025-04-17 10:33:40.682 INFO 8125 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 8ms. Found 0 Redis repository interfaces. +2025-04-17 10:33:40.928 INFO 8125 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 9092 (http) +2025-04-17 10:33:40.931 INFO 8125 --- [restartedMain] o.apache.catalina.core.StandardService : Starting service [Tomcat] +2025-04-17 10:33:40.931 INFO 8125 --- [restartedMain] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.34] +2025-04-17 10:33:40.954 INFO 8125 --- [restartedMain] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext +2025-04-17 10:33:40.955 INFO 8125 --- [restartedMain] o.s.web.context.ContextLoader : Root WebApplicationContext: initialization completed in 512 ms +2025-04-17 10:33:41.050 ERROR 8125 --- [restartedMain] c.b.m.core.MybatisConfiguration : mapper[com.mingchen.mapper.CategoriesMapper.getAllCategoriesWithLaws] is ignored, because it exists, maybe from xml file +2025-04-17 10:33:41.563 INFO 8125 --- [restartedMain] n.b.p.u.AbstractUserAgentAnalyzerDirect : - Loaded 90 files in 242 msec using expression: classpath*:UserAgents/**/*.yaml +2025-04-17 10:33:41.563 INFO 8125 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : +2025-04-17 10:33:41.563 INFO 8125 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : /-----------------------------------------------------------\ +2025-04-17 10:33:41.563 INFO 8125 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : | Yauaa 5.20 (v5.20 @ 2020-11-22T15:39:16Z) | +2025-04-17 10:33:41.563 INFO 8125 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : +-----------------------------------------------------------+ +2025-04-17 10:33:41.563 INFO 8125 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : | For more information: https://yauaa.basjes.nl | +2025-04-17 10:33:41.563 INFO 8125 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : | Copyright (C) 2013-2020 Niels Basjes - License Apache 2.0 | +2025-04-17 10:33:41.563 INFO 8125 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : \-----------------------------------------------------------/ +2025-04-17 10:33:41.563 INFO 8125 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : +2025-04-17 10:33:41.568 INFO 8125 --- [restartedMain] n.b.p.u.AbstractUserAgentAnalyzerDirect : Building all needed matchers for the requested 11 fields. +2025-04-17 10:33:41.642 INFO 8125 --- [restartedMain] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor' +2025-04-17 10:33:41.759 INFO 8125 --- [restartedMain] org.quartz.impl.StdSchedulerFactory : Using default implementation for ThreadExecutor +2025-04-17 10:33:41.763 INFO 8125 --- [restartedMain] org.quartz.core.SchedulerSignalerImpl : Initialized Scheduler Signaller of type: class org.quartz.core.SchedulerSignalerImpl +2025-04-17 10:33:41.763 INFO 8125 --- [restartedMain] org.quartz.core.QuartzScheduler : Quartz Scheduler v.2.3.2 created. +2025-04-17 10:33:41.763 INFO 8125 --- [restartedMain] org.quartz.simpl.RAMJobStore : RAMJobStore initialized. +2025-04-17 10:33:41.763 INFO 8125 --- [restartedMain] org.quartz.core.QuartzScheduler : Scheduler meta-data: Quartz Scheduler (v2.3.2) 'quartzScheduler' with instanceId 'NON_CLUSTERED' + Scheduler class: 'org.quartz.core.QuartzScheduler' - running locally. + NOT STARTED. + Currently in standby mode. + Number of jobs executed: 0 + Using thread pool 'org.quartz.simpl.SimpleThreadPool' - with 10 threads. + Using job-store 'org.quartz.simpl.RAMJobStore' - which does not support persistence. and is not clustered. + +2025-04-17 10:33:41.763 INFO 8125 --- [restartedMain] org.quartz.impl.StdSchedulerFactory : Quartz scheduler 'quartzScheduler' initialized from an externally provided properties instance. +2025-04-17 10:33:41.763 INFO 8125 --- [restartedMain] org.quartz.impl.StdSchedulerFactory : Quartz scheduler version: 2.3.2 +2025-04-17 10:33:41.763 INFO 8125 --- [restartedMain] org.quartz.core.QuartzScheduler : JobFactory set to: org.springframework.scheduling.quartz.SpringBeanJobFactory@1b34752 +2025-04-17 10:33:41.810 INFO 8125 --- [restartedMain] o.s.s.web.DefaultSecurityFilterChain : Creating filter chain: any request, [org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter@4def447f, org.springframework.security.web.context.SecurityContextPersistenceFilter@47c8c079, org.springframework.security.web.header.HeaderWriterFilter@1b152c71, org.springframework.web.filter.CorsFilter@51482dbe, org.springframework.security.web.authentication.logout.LogoutFilter@2dbd4a6e, com.mingchen.common.config.JwtLoginFilter@6484c87, com.mingchen.common.config.JwtFilter@3ed9b9c6, org.springframework.security.web.savedrequest.RequestCacheAwareFilter@7d27c931, org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter@f81fcd0, org.springframework.security.web.authentication.AnonymousAuthenticationFilter@922cede, org.springframework.security.web.session.SessionManagementFilter@12651f77, org.springframework.security.web.access.ExceptionTranslationFilter@13140acd, org.springframework.security.web.access.intercept.FilterSecurityInterceptor@4d13ed2c] +2025-04-17 10:33:41.827 INFO 8125 --- [restartedMain] o.s.b.d.a.OptionalLiveReloadServer : LiveReload server is running on port 35729 +2025-04-17 10:33:41.842 INFO 8125 --- [restartedMain] o.s.s.quartz.SchedulerFactoryBean : Starting Quartz Scheduler now +2025-04-17 10:33:41.842 INFO 8125 --- [restartedMain] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED started. +2025-04-17 10:33:41.855 INFO 8125 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 9092 (http) with context path '' +2025-04-17 10:33:41.858 INFO 8125 --- [restartedMain] com.mingchen.BlogApiApplication : Started BlogApiApplication in 1.613 seconds (JVM running for 1.898) +2025-04-17 10:33:45.002 INFO 8125 --- [http-nio-9092-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet' +2025-04-17 10:33:45.002 INFO 8125 --- [http-nio-9092-exec-1] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet' +2025-04-17 10:33:45.005 INFO 8125 --- [http-nio-9092-exec-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 2 ms +2025-04-17 10:33:45.086 INFO 8125 --- [http-nio-9092-exec-1] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting... +2025-04-17 10:33:45.572 INFO 8125 --- [http-nio-9092-exec-1] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed. +2025-04-17 10:33:45.583 DEBUG 8125 --- [http-nio-9092-exec-1] c.m.m.L.selectList_mpCount : ==> Preparing: SELECT COUNT() FROM learningResources WHERE (category_id = ?) +2025-04-17 10:33:45.603 DEBUG 8125 --- [http-nio-9092-exec-1] c.m.m.L.selectList_mpCount : ==> Parameters: 1(Integer) +2025-04-17 10:33:45.697 ERROR 8125 --- [http-nio-9092-exec-1] c.m.c.h.ControllerExceptionHandler : Request URL : http://localhost:9092/admin/learningResources/page, Exception : + +org.springframework.jdbc.BadSqlGrammarException: +### Error querying database. Cause: java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') FROM learningResources WHERE (category_id = 1)' at line 1 +### The error may exist in com/mingchen/mapper/LearningResourcesMapper.java (best guess) +### The error may involve defaultParameterMap +### The error occurred while setting parameters +### SQL: SELECT COUNT() FROM learningResources WHERE (category_id = ?) +### Cause: java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') FROM learningResources WHERE (category_id = 1)' at line 1 +; bad SQL grammar []; nested exception is java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') FROM learningResources WHERE (category_id = 1)' at line 1 + at org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.doTranslate(SQLErrorCodeSQLExceptionTranslator.java:235) + at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:72) + at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:91) + at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:441) + at jdk.proxy2/jdk.proxy2.$Proxy86.selectList(Unknown Source) + at org.mybatis.spring.SqlSessionTemplate.selectList(SqlSessionTemplate.java:224) + at com.baomidou.mybatisplus.core.override.MybatisMapperMethod.executeForMany(MybatisMapperMethod.java:164) + at com.baomidou.mybatisplus.core.override.MybatisMapperMethod.execute(MybatisMapperMethod.java:77) + at com.baomidou.mybatisplus.core.override.MybatisMapperProxy$PlainMethodInvoker.invoke(MybatisMapperProxy.java:152) + at com.baomidou.mybatisplus.core.override.MybatisMapperProxy.invoke(MybatisMapperProxy.java:89) + at jdk.proxy3/jdk.proxy3.$Proxy89.selectList(Unknown Source) + at com.baomidou.mybatisplus.core.mapper.BaseMapper.selectPage(BaseMapper.java:348) + at java.base/java.lang.invoke.MethodHandle.invokeWithArguments(MethodHandle.java:732) + at com.baomidou.mybatisplus.core.override.MybatisMapperProxy$DefaultMethodInvoker.invoke(MybatisMapperProxy.java:166) + at com.baomidou.mybatisplus.core.override.MybatisMapperProxy.invoke(MybatisMapperProxy.java:89) + at jdk.proxy3/jdk.proxy3.$Proxy89.selectPage(Unknown Source) + at com.mingchen.service.impl.LearningResourcesServiceImpl.getLearningResources(LearningResourcesServiceImpl.java:38) + at com.mingchen.service.impl.LearningResourcesServiceImpl$$FastClassBySpringCGLIB$$d7671a85.invoke() + at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) + at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:687) + at com.mingchen.service.impl.LearningResourcesServiceImpl$$EnhancerBySpringCGLIB$$77b51377.getLearningResources() + at com.mingchen.api.open.LearningResourcesController.getLearningResources(LearningResourcesController.java:32) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:569) + at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:190) + at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:138) + at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:105) + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:879) + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:793) + at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) + at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1040) + at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943) + at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) + at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898) + at javax.servlet.http.HttpServlet.service(HttpServlet.java:503) + at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) + at javax.servlet.http.HttpServlet.service(HttpServlet.java:590) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:320) + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:126) + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:90) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:118) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:137) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:111) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:158) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at com.mingchen.common.config.JwtFilter.doFilter(JwtFilter.java:68) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:200) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:116) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:92) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:92) + at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:77) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:105) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:56) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:215) + at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:178) + at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:358) + at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:271) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202) + at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) + at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541) + at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139) + at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) + at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) + at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) + at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:373) + at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) + at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868) + at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1590) + at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) + at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) + at java.base/java.lang.Thread.run(Thread.java:840) +Caused by: java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') FROM learningResources WHERE (category_id = 1)' at line 1 + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:120) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:97) + at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122) + at com.mysql.cj.jdbc.ClientPreparedStatement.executeInternal(ClientPreparedStatement.java:953) + at com.mysql.cj.jdbc.ClientPreparedStatement.execute(ClientPreparedStatement.java:370) + at com.zaxxer.hikari.pool.ProxyPreparedStatement.execute(ProxyPreparedStatement.java:44) + at com.zaxxer.hikari.pool.HikariProxyPreparedStatement.execute(HikariProxyPreparedStatement.java) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:569) + at org.apache.ibatis.logging.jdbc.PreparedStatementLogger.invoke(PreparedStatementLogger.java:58) + at jdk.proxy4/jdk.proxy4.$Proxy116.execute(Unknown Source) + at org.apache.ibatis.executor.statement.PreparedStatementHandler.query(PreparedStatementHandler.java:65) + at org.apache.ibatis.executor.statement.RoutingStatementHandler.query(RoutingStatementHandler.java:80) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:569) + at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:61) + at jdk.proxy2/jdk.proxy2.$Proxy114.query(Unknown Source) + at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:65) + at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:336) + at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:158) + at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:110) + at com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor.willDoQuery(PaginationInnerInterceptor.java:141) + at com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor.intercept(MybatisPlusInterceptor.java:75) + at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:59) + at jdk.proxy2/jdk.proxy2.$Proxy113.query(Unknown Source) + at com.github.pagehelper.PageInterceptor.intercept(PageInterceptor.java:108) + at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:59) + at jdk.proxy2/jdk.proxy2.$Proxy113.query(Unknown Source) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:154) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:147) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:142) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:569) + at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:427) + ... 106 common frames omitted + +2025-04-17 10:33:45.717 WARN 8125 --- [http-nio-9092-exec-1] .m.m.a.ExceptionHandlerExceptionResolver : Resolved [org.springframework.jdbc.BadSqlGrammarException: +### Error querying database. Cause: java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') FROM learningResources WHERE (category_id = 1)' at line 1 +### The error may exist in com/mingchen/mapper/LearningResourcesMapper.java (best guess) +### The error may involve defaultParameterMap +### The error occurred while setting parameters +### SQL: SELECT COUNT() FROM learningResources WHERE (category_id = ?) +### Cause: java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') FROM learningResources WHERE (category_id = 1)' at line 1 +; bad SQL grammar []; nested exception is java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') FROM learningResources WHERE (category_id = 1)' at line 1] +2025-04-17 10:34:17.986 DEBUG 8125 --- [http-nio-9092-exec-2] c.m.m.L.selectList_mpCount : ==> Preparing: SELECT COUNT() FROM learningResources WHERE (category_id = ?) +2025-04-17 10:34:17.989 DEBUG 8125 --- [http-nio-9092-exec-2] c.m.m.L.selectList_mpCount : ==> Parameters: 1(Integer) +2025-04-17 10:37:20.836 WARN 8125 --- [HikariPool-1 housekeeper] com.zaxxer.hikari.pool.HikariPool : HikariPool-1 - Thread starvation or clock leap detected (housekeeper delta=3m5s125ms). +2025-04-17 10:37:20.842 ERROR 8125 --- [http-nio-9092-exec-2] c.m.c.h.ControllerExceptionHandler : Request URL : http://localhost:9092/admin/learningResources/page, Exception : + +org.springframework.jdbc.BadSqlGrammarException: +### Error querying database. Cause: java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') FROM learningResources WHERE (category_id = 1)' at line 1 +### The error may exist in com/mingchen/mapper/LearningResourcesMapper.java (best guess) +### The error may involve defaultParameterMap +### The error occurred while setting parameters +### SQL: SELECT COUNT() FROM learningResources WHERE (category_id = ?) +### Cause: java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') FROM learningResources WHERE (category_id = 1)' at line 1 +; bad SQL grammar []; nested exception is java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') FROM learningResources WHERE (category_id = 1)' at line 1 + at org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.doTranslate(SQLErrorCodeSQLExceptionTranslator.java:235) + at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:72) + at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:91) + at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:441) + at jdk.proxy2/jdk.proxy2.$Proxy86.selectList(Unknown Source) + at org.mybatis.spring.SqlSessionTemplate.selectList(SqlSessionTemplate.java:224) + at com.baomidou.mybatisplus.core.override.MybatisMapperMethod.executeForMany(MybatisMapperMethod.java:164) + at com.baomidou.mybatisplus.core.override.MybatisMapperMethod.execute(MybatisMapperMethod.java:77) + at com.baomidou.mybatisplus.core.override.MybatisMapperProxy$PlainMethodInvoker.invoke(MybatisMapperProxy.java:152) + at com.baomidou.mybatisplus.core.override.MybatisMapperProxy.invoke(MybatisMapperProxy.java:89) + at jdk.proxy3/jdk.proxy3.$Proxy89.selectList(Unknown Source) + at com.baomidou.mybatisplus.core.mapper.BaseMapper.selectPage(BaseMapper.java:348) + at java.base/java.lang.invoke.MethodHandle.invokeWithArguments(MethodHandle.java:732) + at com.baomidou.mybatisplus.core.override.MybatisMapperProxy$DefaultMethodInvoker.invoke(MybatisMapperProxy.java:166) + at com.baomidou.mybatisplus.core.override.MybatisMapperProxy.invoke(MybatisMapperProxy.java:89) + at jdk.proxy3/jdk.proxy3.$Proxy89.selectPage(Unknown Source) + at com.mingchen.service.impl.LearningResourcesServiceImpl.getLearningResources(LearningResourcesServiceImpl.java:38) + at com.mingchen.service.impl.LearningResourcesServiceImpl$$FastClassBySpringCGLIB$$d7671a85.invoke() + at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) + at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:687) + at com.mingchen.service.impl.LearningResourcesServiceImpl$$EnhancerBySpringCGLIB$$77b51377.getLearningResources() + at com.mingchen.api.open.LearningResourcesController.getLearningResources(LearningResourcesController.java:32) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:569) + at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:190) + at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:138) + at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:105) + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:879) + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:793) + at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) + at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1040) + at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943) + at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) + at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898) + at javax.servlet.http.HttpServlet.service(HttpServlet.java:503) + at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) + at javax.servlet.http.HttpServlet.service(HttpServlet.java:590) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:320) + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:126) + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:90) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:118) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:137) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:111) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:158) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at com.mingchen.common.config.JwtFilter.doFilter(JwtFilter.java:68) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:200) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:116) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:92) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:92) + at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:77) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:105) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:56) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:215) + at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:178) + at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:358) + at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:271) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202) + at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) + at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541) + at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139) + at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) + at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) + at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) + at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:373) + at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) + at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868) + at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1590) + at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) + at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) + at java.base/java.lang.Thread.run(Thread.java:840) +Caused by: java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') FROM learningResources WHERE (category_id = 1)' at line 1 + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:120) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:97) + at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122) + at com.mysql.cj.jdbc.ClientPreparedStatement.executeInternal(ClientPreparedStatement.java:953) + at com.mysql.cj.jdbc.ClientPreparedStatement.execute(ClientPreparedStatement.java:370) + at com.zaxxer.hikari.pool.ProxyPreparedStatement.execute(ProxyPreparedStatement.java:44) + at com.zaxxer.hikari.pool.HikariProxyPreparedStatement.execute(HikariProxyPreparedStatement.java) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:569) + at org.apache.ibatis.logging.jdbc.PreparedStatementLogger.invoke(PreparedStatementLogger.java:58) + at jdk.proxy4/jdk.proxy4.$Proxy116.execute(Unknown Source) + at org.apache.ibatis.executor.statement.PreparedStatementHandler.query(PreparedStatementHandler.java:65) + at org.apache.ibatis.executor.statement.RoutingStatementHandler.query(RoutingStatementHandler.java:80) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:569) + at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:61) + at jdk.proxy2/jdk.proxy2.$Proxy114.query(Unknown Source) + at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:65) + at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:336) + at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:158) + at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:110) + at com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor.willDoQuery(PaginationInnerInterceptor.java:141) + at com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor.intercept(MybatisPlusInterceptor.java:75) + at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:59) + at jdk.proxy2/jdk.proxy2.$Proxy113.query(Unknown Source) + at com.github.pagehelper.PageInterceptor.intercept(PageInterceptor.java:108) + at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:59) + at jdk.proxy2/jdk.proxy2.$Proxy113.query(Unknown Source) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:154) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:147) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:142) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:569) + at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:427) + ... 106 common frames omitted + +2025-04-17 10:37:20.846 WARN 8125 --- [http-nio-9092-exec-2] .m.m.a.ExceptionHandlerExceptionResolver : Resolved [org.springframework.jdbc.BadSqlGrammarException: +### Error querying database. Cause: java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') FROM learningResources WHERE (category_id = 1)' at line 1 +### The error may exist in com/mingchen/mapper/LearningResourcesMapper.java (best guess) +### The error may involve defaultParameterMap +### The error occurred while setting parameters +### SQL: SELECT COUNT() FROM learningResources WHERE (category_id = ?) +### Cause: java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') FROM learningResources WHERE (category_id = 1)' at line 1 +; bad SQL grammar []; nested exception is java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') FROM learningResources WHERE (category_id = 1)' at line 1] +2025-04-17 10:37:20.889 INFO 8125 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED paused. +2025-04-17 10:37:20.890 INFO 8125 --- [SpringContextShutdownHook] o.s.s.quartz.SchedulerFactoryBean : Shutting down Quartz Scheduler +2025-04-17 10:37:20.890 INFO 8125 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED shutting down. +2025-04-17 10:37:20.890 INFO 8125 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED paused. +2025-04-17 10:37:20.890 INFO 8125 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED shutdown complete. +2025-04-17 10:37:20.891 INFO 8125 --- [SpringContextShutdownHook] o.s.s.concurrent.ThreadPoolTaskExecutor : Shutting down ExecutorService 'applicationTaskExecutor' +2025-04-17 10:37:20.899 INFO 8125 --- [SpringContextShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown initiated... +2025-04-17 10:37:20.901 INFO 8125 --- [SpringContextShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown completed. +2025-04-17 10:37:23.097 INFO 8332 --- [restartedMain] com.mingchen.BlogApiApplication : Starting BlogApiApplication on mingchendeMac-mini.local with PID 8332 (/Users/mingchen/code/java/other/legalAid/api/target/classes started by mingchen in /Users/mingchen/code/java/other/legalAid) +2025-04-17 10:37:23.098 DEBUG 8332 --- [restartedMain] com.mingchen.BlogApiApplication : Running with Spring Boot v2.2.7.RELEASE, Spring v5.2.6.RELEASE +2025-04-17 10:37:23.098 INFO 8332 --- [restartedMain] com.mingchen.BlogApiApplication : The following profiles are active: dev +2025-04-17 10:37:23.113 INFO 8332 --- [restartedMain] o.s.b.devtools.restart.ChangeableUrls : The Class-Path manifest attribute in /usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/jaxb-runtime-2.3.1.jar referenced one or more files that do not exist: file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/jaxb-api-2.3.1.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/txw2-2.3.1.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/istack-commons-runtime-3.0.7.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/stax-ex-1.8.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/FastInfoset-1.2.15.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/javax.activation-api-1.2.0.jar +2025-04-17 10:37:23.113 INFO 8332 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : Devtools property defaults active! Set 'spring.devtools.add-properties' to 'false' to disable +2025-04-17 10:37:23.113 INFO 8332 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : For additional web related logging consider setting the 'logging.level.web' property to 'DEBUG' +2025-04-17 10:37:23.319 INFO 8332 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Multiple Spring Data modules found, entering strict repository configuration mode! +2025-04-17 10:37:23.320 INFO 8332 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data Redis repositories in DEFAULT mode. +2025-04-17 10:37:23.331 INFO 8332 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 7ms. Found 0 Redis repository interfaces. +2025-04-17 10:37:23.580 INFO 8332 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 9092 (http) +2025-04-17 10:37:23.583 INFO 8332 --- [restartedMain] o.apache.catalina.core.StandardService : Starting service [Tomcat] +2025-04-17 10:37:23.583 INFO 8332 --- [restartedMain] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.34] +2025-04-17 10:37:23.607 INFO 8332 --- [restartedMain] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext +2025-04-17 10:37:23.607 INFO 8332 --- [restartedMain] o.s.web.context.ContextLoader : Root WebApplicationContext: initialization completed in 494 ms +2025-04-17 10:37:23.695 ERROR 8332 --- [restartedMain] c.b.m.core.MybatisConfiguration : mapper[com.mingchen.mapper.CategoriesMapper.getAllCategoriesWithLaws] is ignored, because it exists, maybe from xml file +2025-04-17 10:37:24.108 INFO 8332 --- [restartedMain] n.b.p.u.AbstractUserAgentAnalyzerDirect : - Loaded 90 files in 204 msec using expression: classpath*:UserAgents/**/*.yaml +2025-04-17 10:37:24.108 INFO 8332 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : +2025-04-17 10:37:24.108 INFO 8332 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : /-----------------------------------------------------------\ +2025-04-17 10:37:24.109 INFO 8332 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : | Yauaa 5.20 (v5.20 @ 2020-11-22T15:39:16Z) | +2025-04-17 10:37:24.109 INFO 8332 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : +-----------------------------------------------------------+ +2025-04-17 10:37:24.109 INFO 8332 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : | For more information: https://yauaa.basjes.nl | +2025-04-17 10:37:24.109 INFO 8332 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : | Copyright (C) 2013-2020 Niels Basjes - License Apache 2.0 | +2025-04-17 10:37:24.109 INFO 8332 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : \-----------------------------------------------------------/ +2025-04-17 10:37:24.109 INFO 8332 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : +2025-04-17 10:37:24.113 INFO 8332 --- [restartedMain] n.b.p.u.AbstractUserAgentAnalyzerDirect : Building all needed matchers for the requested 11 fields. +2025-04-17 10:37:24.170 INFO 8332 --- [restartedMain] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor' +2025-04-17 10:37:24.253 INFO 8332 --- [restartedMain] org.quartz.impl.StdSchedulerFactory : Using default implementation for ThreadExecutor +2025-04-17 10:37:24.257 INFO 8332 --- [restartedMain] org.quartz.core.SchedulerSignalerImpl : Initialized Scheduler Signaller of type: class org.quartz.core.SchedulerSignalerImpl +2025-04-17 10:37:24.257 INFO 8332 --- [restartedMain] org.quartz.core.QuartzScheduler : Quartz Scheduler v.2.3.2 created. +2025-04-17 10:37:24.257 INFO 8332 --- [restartedMain] org.quartz.simpl.RAMJobStore : RAMJobStore initialized. +2025-04-17 10:37:24.257 INFO 8332 --- [restartedMain] org.quartz.core.QuartzScheduler : Scheduler meta-data: Quartz Scheduler (v2.3.2) 'quartzScheduler' with instanceId 'NON_CLUSTERED' + Scheduler class: 'org.quartz.core.QuartzScheduler' - running locally. + NOT STARTED. + Currently in standby mode. + Number of jobs executed: 0 + Using thread pool 'org.quartz.simpl.SimpleThreadPool' - with 10 threads. + Using job-store 'org.quartz.simpl.RAMJobStore' - which does not support persistence. and is not clustered. + +2025-04-17 10:37:24.257 INFO 8332 --- [restartedMain] org.quartz.impl.StdSchedulerFactory : Quartz scheduler 'quartzScheduler' initialized from an externally provided properties instance. +2025-04-17 10:37:24.257 INFO 8332 --- [restartedMain] org.quartz.impl.StdSchedulerFactory : Quartz scheduler version: 2.3.2 +2025-04-17 10:37:24.257 INFO 8332 --- [restartedMain] org.quartz.core.QuartzScheduler : JobFactory set to: org.springframework.scheduling.quartz.SpringBeanJobFactory@24074bba +2025-04-17 10:37:24.287 INFO 8332 --- [restartedMain] o.s.s.web.DefaultSecurityFilterChain : Creating filter chain: any request, [org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter@72d28df2, org.springframework.security.web.context.SecurityContextPersistenceFilter@48c07978, org.springframework.security.web.header.HeaderWriterFilter@1cb34e11, org.springframework.web.filter.CorsFilter@4b91761e, org.springframework.security.web.authentication.logout.LogoutFilter@72abd3d3, com.mingchen.common.config.JwtLoginFilter@b54bb24, com.mingchen.common.config.JwtFilter@314bf4fd, org.springframework.security.web.savedrequest.RequestCacheAwareFilter@fe7b2b, org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter@256b1033, org.springframework.security.web.authentication.AnonymousAuthenticationFilter@5790523b, org.springframework.security.web.session.SessionManagementFilter@2f1fe0e5, org.springframework.security.web.access.ExceptionTranslationFilter@492f1a3a, org.springframework.security.web.access.intercept.FilterSecurityInterceptor@46724d31] +2025-04-17 10:37:24.298 INFO 8332 --- [restartedMain] o.s.b.d.a.OptionalLiveReloadServer : LiveReload server is running on port 35729 +2025-04-17 10:37:24.307 INFO 8332 --- [restartedMain] o.s.s.quartz.SchedulerFactoryBean : Starting Quartz Scheduler now +2025-04-17 10:37:24.307 INFO 8332 --- [restartedMain] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED started. +2025-04-17 10:37:24.316 INFO 8332 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 9092 (http) with context path '' +2025-04-17 10:37:24.318 INFO 8332 --- [restartedMain] com.mingchen.BlogApiApplication : Started BlogApiApplication in 1.362 seconds (JVM running for 1.613) +2025-04-17 10:37:33.757 INFO 8332 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED paused. +2025-04-17 10:37:33.758 INFO 8332 --- [SpringContextShutdownHook] o.s.s.quartz.SchedulerFactoryBean : Shutting down Quartz Scheduler +2025-04-17 10:37:33.758 INFO 8332 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED shutting down. +2025-04-17 10:37:33.758 INFO 8332 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED paused. +2025-04-17 10:37:33.758 INFO 8332 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED shutdown complete. +2025-04-17 10:37:33.759 INFO 8332 --- [SpringContextShutdownHook] o.s.s.concurrent.ThreadPoolTaskExecutor : Shutting down ExecutorService 'applicationTaskExecutor' +2025-04-17 10:37:35.782 INFO 8346 --- [restartedMain] com.mingchen.BlogApiApplication : Starting BlogApiApplication on mingchendeMac-mini.local with PID 8346 (/Users/mingchen/code/java/other/legalAid/api/target/classes started by mingchen in /Users/mingchen/code/java/other/legalAid) +2025-04-17 10:37:35.784 DEBUG 8346 --- [restartedMain] com.mingchen.BlogApiApplication : Running with Spring Boot v2.2.7.RELEASE, Spring v5.2.6.RELEASE +2025-04-17 10:37:35.784 INFO 8346 --- [restartedMain] com.mingchen.BlogApiApplication : The following profiles are active: dev +2025-04-17 10:37:35.804 INFO 8346 --- [restartedMain] o.s.b.devtools.restart.ChangeableUrls : The Class-Path manifest attribute in /usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/jaxb-runtime-2.3.1.jar referenced one or more files that do not exist: file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/jaxb-api-2.3.1.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/txw2-2.3.1.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/istack-commons-runtime-3.0.7.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/stax-ex-1.8.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/FastInfoset-1.2.15.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/javax.activation-api-1.2.0.jar +2025-04-17 10:37:35.804 INFO 8346 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : Devtools property defaults active! Set 'spring.devtools.add-properties' to 'false' to disable +2025-04-17 10:37:35.804 INFO 8346 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : For additional web related logging consider setting the 'logging.level.web' property to 'DEBUG' +2025-04-17 10:37:35.998 INFO 8346 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Multiple Spring Data modules found, entering strict repository configuration mode! +2025-04-17 10:37:35.999 INFO 8346 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data Redis repositories in DEFAULT mode. +2025-04-17 10:37:36.009 INFO 8346 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 6ms. Found 0 Redis repository interfaces. +2025-04-17 10:37:36.263 INFO 8346 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 9092 (http) +2025-04-17 10:37:36.269 INFO 8346 --- [restartedMain] o.apache.catalina.core.StandardService : Starting service [Tomcat] +2025-04-17 10:37:36.269 INFO 8346 --- [restartedMain] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.34] +2025-04-17 10:37:36.306 INFO 8346 --- [restartedMain] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext +2025-04-17 10:37:36.306 INFO 8346 --- [restartedMain] o.s.web.context.ContextLoader : Root WebApplicationContext: initialization completed in 502 ms +2025-04-17 10:37:36.455 ERROR 8346 --- [restartedMain] c.b.m.core.MybatisConfiguration : mapper[com.mingchen.mapper.CategoriesMapper.getAllCategoriesWithLaws] is ignored, because it exists, maybe from xml file +2025-04-17 10:37:36.931 INFO 8346 --- [restartedMain] n.b.p.u.AbstractUserAgentAnalyzerDirect : - Loaded 90 files in 209 msec using expression: classpath*:UserAgents/**/*.yaml +2025-04-17 10:37:36.931 INFO 8346 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : +2025-04-17 10:37:36.931 INFO 8346 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : /-----------------------------------------------------------\ +2025-04-17 10:37:36.931 INFO 8346 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : | Yauaa 5.20 (v5.20 @ 2020-11-22T15:39:16Z) | +2025-04-17 10:37:36.931 INFO 8346 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : +-----------------------------------------------------------+ +2025-04-17 10:37:36.931 INFO 8346 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : | For more information: https://yauaa.basjes.nl | +2025-04-17 10:37:36.931 INFO 8346 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : | Copyright (C) 2013-2020 Niels Basjes - License Apache 2.0 | +2025-04-17 10:37:36.931 INFO 8346 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : \-----------------------------------------------------------/ +2025-04-17 10:37:36.931 INFO 8346 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : +2025-04-17 10:37:36.934 INFO 8346 --- [restartedMain] n.b.p.u.AbstractUserAgentAnalyzerDirect : Building all needed matchers for the requested 11 fields. +2025-04-17 10:37:36.990 INFO 8346 --- [restartedMain] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor' +2025-04-17 10:37:37.081 INFO 8346 --- [restartedMain] org.quartz.impl.StdSchedulerFactory : Using default implementation for ThreadExecutor +2025-04-17 10:37:37.085 INFO 8346 --- [restartedMain] org.quartz.core.SchedulerSignalerImpl : Initialized Scheduler Signaller of type: class org.quartz.core.SchedulerSignalerImpl +2025-04-17 10:37:37.085 INFO 8346 --- [restartedMain] org.quartz.core.QuartzScheduler : Quartz Scheduler v.2.3.2 created. +2025-04-17 10:37:37.086 INFO 8346 --- [restartedMain] org.quartz.simpl.RAMJobStore : RAMJobStore initialized. +2025-04-17 10:37:37.086 INFO 8346 --- [restartedMain] org.quartz.core.QuartzScheduler : Scheduler meta-data: Quartz Scheduler (v2.3.2) 'quartzScheduler' with instanceId 'NON_CLUSTERED' + Scheduler class: 'org.quartz.core.QuartzScheduler' - running locally. + NOT STARTED. + Currently in standby mode. + Number of jobs executed: 0 + Using thread pool 'org.quartz.simpl.SimpleThreadPool' - with 10 threads. + Using job-store 'org.quartz.simpl.RAMJobStore' - which does not support persistence. and is not clustered. + +2025-04-17 10:37:37.086 INFO 8346 --- [restartedMain] org.quartz.impl.StdSchedulerFactory : Quartz scheduler 'quartzScheduler' initialized from an externally provided properties instance. +2025-04-17 10:37:37.086 INFO 8346 --- [restartedMain] org.quartz.impl.StdSchedulerFactory : Quartz scheduler version: 2.3.2 +2025-04-17 10:37:37.086 INFO 8346 --- [restartedMain] org.quartz.core.QuartzScheduler : JobFactory set to: org.springframework.scheduling.quartz.SpringBeanJobFactory@5e064aa0 +2025-04-17 10:37:37.121 INFO 8346 --- [restartedMain] o.s.s.web.DefaultSecurityFilterChain : Creating filter chain: any request, [org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter@75f49b03, org.springframework.security.web.context.SecurityContextPersistenceFilter@1e631239, org.springframework.security.web.header.HeaderWriterFilter@743f29a, org.springframework.web.filter.CorsFilter@613fd875, org.springframework.security.web.authentication.logout.LogoutFilter@96f9f66, com.mingchen.common.config.JwtLoginFilter@6cd16bda, com.mingchen.common.config.JwtFilter@6b18070e, org.springframework.security.web.savedrequest.RequestCacheAwareFilter@7d0617f7, org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter@18809394, org.springframework.security.web.authentication.AnonymousAuthenticationFilter@3ae5b5ed, org.springframework.security.web.session.SessionManagementFilter@4decbf17, org.springframework.security.web.access.ExceptionTranslationFilter@4357779f, org.springframework.security.web.access.intercept.FilterSecurityInterceptor@408fbf10] +2025-04-17 10:37:37.133 INFO 8346 --- [restartedMain] o.s.b.d.a.OptionalLiveReloadServer : LiveReload server is running on port 35729 +2025-04-17 10:37:37.144 INFO 8346 --- [restartedMain] o.s.s.quartz.SchedulerFactoryBean : Starting Quartz Scheduler now +2025-04-17 10:37:37.144 INFO 8346 --- [restartedMain] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED started. +2025-04-17 10:37:37.155 INFO 8346 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 9092 (http) with context path '' +2025-04-17 10:37:37.157 INFO 8346 --- [restartedMain] com.mingchen.BlogApiApplication : Started BlogApiApplication in 1.631 seconds (JVM running for 1.936) +2025-04-17 10:39:05.934 INFO 8346 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED paused. +2025-04-17 10:39:05.935 INFO 8346 --- [SpringContextShutdownHook] o.s.s.quartz.SchedulerFactoryBean : Shutting down Quartz Scheduler +2025-04-17 10:39:05.935 INFO 8346 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED shutting down. +2025-04-17 10:39:05.935 INFO 8346 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED paused. +2025-04-17 10:39:05.935 INFO 8346 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED shutdown complete. +2025-04-17 10:39:05.936 INFO 8346 --- [SpringContextShutdownHook] o.s.s.concurrent.ThreadPoolTaskExecutor : Shutting down ExecutorService 'applicationTaskExecutor' +2025-04-17 10:39:08.770 INFO 8424 --- [restartedMain] com.mingchen.BlogApiApplication : Starting BlogApiApplication on mingchendeMac-mini.local with PID 8424 (/Users/mingchen/code/java/other/legalAid/api/target/classes started by mingchen in /Users/mingchen/code/java/other/legalAid) +2025-04-17 10:39:08.771 DEBUG 8424 --- [restartedMain] com.mingchen.BlogApiApplication : Running with Spring Boot v2.2.7.RELEASE, Spring v5.2.6.RELEASE +2025-04-17 10:39:08.771 INFO 8424 --- [restartedMain] com.mingchen.BlogApiApplication : The following profiles are active: dev +2025-04-17 10:39:08.786 INFO 8424 --- [restartedMain] o.s.b.devtools.restart.ChangeableUrls : The Class-Path manifest attribute in /usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/jaxb-runtime-2.3.1.jar referenced one or more files that do not exist: file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/jaxb-api-2.3.1.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/txw2-2.3.1.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/istack-commons-runtime-3.0.7.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/stax-ex-1.8.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/FastInfoset-1.2.15.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/javax.activation-api-1.2.0.jar +2025-04-17 10:39:08.786 INFO 8424 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : Devtools property defaults active! Set 'spring.devtools.add-properties' to 'false' to disable +2025-04-17 10:39:08.786 INFO 8424 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : For additional web related logging consider setting the 'logging.level.web' property to 'DEBUG' +2025-04-17 10:39:08.972 INFO 8424 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Multiple Spring Data modules found, entering strict repository configuration mode! +2025-04-17 10:39:08.973 INFO 8424 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data Redis repositories in DEFAULT mode. +2025-04-17 10:39:08.984 INFO 8424 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 7ms. Found 0 Redis repository interfaces. +2025-04-17 10:39:09.221 INFO 8424 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 9092 (http) +2025-04-17 10:39:09.224 INFO 8424 --- [restartedMain] o.apache.catalina.core.StandardService : Starting service [Tomcat] +2025-04-17 10:39:09.224 INFO 8424 --- [restartedMain] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.34] +2025-04-17 10:39:09.245 INFO 8424 --- [restartedMain] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext +2025-04-17 10:39:09.245 INFO 8424 --- [restartedMain] o.s.web.context.ContextLoader : Root WebApplicationContext: initialization completed in 459 ms +2025-04-17 10:39:09.762 INFO 8424 --- [restartedMain] n.b.p.u.AbstractUserAgentAnalyzerDirect : - Loaded 90 files in 207 msec using expression: classpath*:UserAgents/**/*.yaml +2025-04-17 10:39:09.762 INFO 8424 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : +2025-04-17 10:39:09.762 INFO 8424 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : /-----------------------------------------------------------\ +2025-04-17 10:39:09.762 INFO 8424 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : | Yauaa 5.20 (v5.20 @ 2020-11-22T15:39:16Z) | +2025-04-17 10:39:09.762 INFO 8424 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : +-----------------------------------------------------------+ +2025-04-17 10:39:09.762 INFO 8424 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : | For more information: https://yauaa.basjes.nl | +2025-04-17 10:39:09.762 INFO 8424 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : | Copyright (C) 2013-2020 Niels Basjes - License Apache 2.0 | +2025-04-17 10:39:09.762 INFO 8424 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : \-----------------------------------------------------------/ +2025-04-17 10:39:09.762 INFO 8424 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : +2025-04-17 10:39:09.764 INFO 8424 --- [restartedMain] n.b.p.u.AbstractUserAgentAnalyzerDirect : Building all needed matchers for the requested 11 fields. +2025-04-17 10:39:09.824 INFO 8424 --- [restartedMain] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor' +2025-04-17 10:39:09.915 INFO 8424 --- [restartedMain] org.quartz.impl.StdSchedulerFactory : Using default implementation for ThreadExecutor +2025-04-17 10:39:09.919 INFO 8424 --- [restartedMain] org.quartz.core.SchedulerSignalerImpl : Initialized Scheduler Signaller of type: class org.quartz.core.SchedulerSignalerImpl +2025-04-17 10:39:09.919 INFO 8424 --- [restartedMain] org.quartz.core.QuartzScheduler : Quartz Scheduler v.2.3.2 created. +2025-04-17 10:39:09.919 INFO 8424 --- [restartedMain] org.quartz.simpl.RAMJobStore : RAMJobStore initialized. +2025-04-17 10:39:09.919 INFO 8424 --- [restartedMain] org.quartz.core.QuartzScheduler : Scheduler meta-data: Quartz Scheduler (v2.3.2) 'quartzScheduler' with instanceId 'NON_CLUSTERED' + Scheduler class: 'org.quartz.core.QuartzScheduler' - running locally. + NOT STARTED. + Currently in standby mode. + Number of jobs executed: 0 + Using thread pool 'org.quartz.simpl.SimpleThreadPool' - with 10 threads. + Using job-store 'org.quartz.simpl.RAMJobStore' - which does not support persistence. and is not clustered. + +2025-04-17 10:39:09.919 INFO 8424 --- [restartedMain] org.quartz.impl.StdSchedulerFactory : Quartz scheduler 'quartzScheduler' initialized from an externally provided properties instance. +2025-04-17 10:39:09.919 INFO 8424 --- [restartedMain] org.quartz.impl.StdSchedulerFactory : Quartz scheduler version: 2.3.2 +2025-04-17 10:39:09.919 INFO 8424 --- [restartedMain] org.quartz.core.QuartzScheduler : JobFactory set to: org.springframework.scheduling.quartz.SpringBeanJobFactory@167bd7f7 +2025-04-17 10:39:09.954 INFO 8424 --- [restartedMain] o.s.s.web.DefaultSecurityFilterChain : Creating filter chain: any request, [org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter@44ee1586, org.springframework.security.web.context.SecurityContextPersistenceFilter@3e3eff4c, org.springframework.security.web.header.HeaderWriterFilter@474679be, org.springframework.web.filter.CorsFilter@635b47c4, org.springframework.security.web.authentication.logout.LogoutFilter@43a88494, com.mingchen.common.config.JwtLoginFilter@14d864a7, com.mingchen.common.config.JwtFilter@2c8486ba, org.springframework.security.web.savedrequest.RequestCacheAwareFilter@36d8f402, org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter@5322bded, org.springframework.security.web.authentication.AnonymousAuthenticationFilter@18f2f489, org.springframework.security.web.session.SessionManagementFilter@28557307, org.springframework.security.web.access.ExceptionTranslationFilter@6ae4c410, org.springframework.security.web.access.intercept.FilterSecurityInterceptor@148fe145] +2025-04-17 10:39:09.966 INFO 8424 --- [restartedMain] o.s.b.d.a.OptionalLiveReloadServer : LiveReload server is running on port 35729 +2025-04-17 10:39:09.976 INFO 8424 --- [restartedMain] o.s.s.quartz.SchedulerFactoryBean : Starting Quartz Scheduler now +2025-04-17 10:39:09.976 INFO 8424 --- [restartedMain] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED started. +2025-04-17 10:39:09.987 INFO 8424 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 9092 (http) with context path '' +2025-04-17 10:39:09.989 INFO 8424 --- [restartedMain] com.mingchen.BlogApiApplication : Started BlogApiApplication in 1.367 seconds (JVM running for 1.737) +2025-04-17 10:39:26.436 INFO 8424 --- [http-nio-9092-exec-2] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet' +2025-04-17 10:39:26.436 INFO 8424 --- [http-nio-9092-exec-2] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet' +2025-04-17 10:39:26.439 INFO 8424 --- [http-nio-9092-exec-2] o.s.web.servlet.DispatcherServlet : Completed initialization in 3 ms +2025-04-17 10:39:29.146 INFO 8424 --- [http-nio-9092-exec-2] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting... +2025-04-17 10:39:29.934 INFO 8424 --- [http-nio-9092-exec-2] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed. +2025-04-17 10:39:29.976 DEBUG 8424 --- [http-nio-9092-exec-2] c.m.m.L.selectList_mpCount : ==> Preparing: SELECT COUNT() FROM learningResources WHERE (category_id = ?) +2025-04-17 10:39:30.103 DEBUG 8424 --- [http-nio-9092-exec-2] c.m.m.L.selectList_mpCount : ==> Parameters: 1(Integer) +2025-04-17 10:39:32.187 ERROR 8424 --- [http-nio-9092-exec-2] c.m.c.h.ControllerExceptionHandler : Request URL : http://localhost:9092/admin/learningResources/page, Exception : + +org.springframework.jdbc.BadSqlGrammarException: +### Error querying database. Cause: java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') FROM learningResources WHERE (category_id = 1)' at line 1 +### The error may exist in com/mingchen/mapper/LearningResourcesMapper.java (best guess) +### The error may involve defaultParameterMap +### The error occurred while setting parameters +### SQL: SELECT COUNT() FROM learningResources WHERE (category_id = ?) +### Cause: java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') FROM learningResources WHERE (category_id = 1)' at line 1 +; bad SQL grammar []; nested exception is java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') FROM learningResources WHERE (category_id = 1)' at line 1 + at org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.doTranslate(SQLErrorCodeSQLExceptionTranslator.java:235) + at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:72) + at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:91) + at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:441) + at jdk.proxy2/jdk.proxy2.$Proxy85.selectList(Unknown Source) + at org.mybatis.spring.SqlSessionTemplate.selectList(SqlSessionTemplate.java:224) + at com.baomidou.mybatisplus.core.override.MybatisMapperMethod.executeForMany(MybatisMapperMethod.java:164) + at com.baomidou.mybatisplus.core.override.MybatisMapperMethod.execute(MybatisMapperMethod.java:77) + at com.baomidou.mybatisplus.core.override.MybatisMapperProxy$PlainMethodInvoker.invoke(MybatisMapperProxy.java:152) + at com.baomidou.mybatisplus.core.override.MybatisMapperProxy.invoke(MybatisMapperProxy.java:89) + at jdk.proxy3/jdk.proxy3.$Proxy88.selectList(Unknown Source) + at com.baomidou.mybatisplus.core.mapper.BaseMapper.selectPage(BaseMapper.java:348) + at java.base/java.lang.invoke.MethodHandle.invokeWithArguments(MethodHandle.java:732) + at com.baomidou.mybatisplus.core.override.MybatisMapperProxy$DefaultMethodInvoker.invoke(MybatisMapperProxy.java:166) + at com.baomidou.mybatisplus.core.override.MybatisMapperProxy.invoke(MybatisMapperProxy.java:89) + at jdk.proxy3/jdk.proxy3.$Proxy88.selectPage(Unknown Source) + at com.mingchen.service.impl.LearningResourcesServiceImpl.getLearningResources(LearningResourcesServiceImpl.java:40) + at com.mingchen.service.impl.LearningResourcesServiceImpl$$FastClassBySpringCGLIB$$d7671a85.invoke() + at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) + at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:687) + at com.mingchen.service.impl.LearningResourcesServiceImpl$$EnhancerBySpringCGLIB$$98442bc2.getLearningResources() + at com.mingchen.api.open.LearningResourcesController.getLearningResources(LearningResourcesController.java:32) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:569) + at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:190) + at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:138) + at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:105) + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:879) + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:793) + at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) + at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1040) + at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943) + at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) + at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898) + at javax.servlet.http.HttpServlet.service(HttpServlet.java:503) + at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) + at javax.servlet.http.HttpServlet.service(HttpServlet.java:590) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:320) + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:126) + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:90) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:118) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:137) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:111) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:158) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at com.mingchen.common.config.JwtFilter.doFilter(JwtFilter.java:68) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:200) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:116) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:92) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:92) + at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:77) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:105) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:56) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:215) + at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:178) + at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:358) + at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:271) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202) + at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) + at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541) + at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139) + at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) + at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) + at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) + at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:373) + at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) + at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868) + at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1590) + at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) + at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) + at java.base/java.lang.Thread.run(Thread.java:840) +Caused by: java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') FROM learningResources WHERE (category_id = 1)' at line 1 + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:120) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:97) + at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122) + at com.mysql.cj.jdbc.ClientPreparedStatement.executeInternal(ClientPreparedStatement.java:953) + at com.mysql.cj.jdbc.ClientPreparedStatement.execute(ClientPreparedStatement.java:370) + at com.zaxxer.hikari.pool.ProxyPreparedStatement.execute(ProxyPreparedStatement.java:44) + at com.zaxxer.hikari.pool.HikariProxyPreparedStatement.execute(HikariProxyPreparedStatement.java) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:569) + at org.apache.ibatis.logging.jdbc.PreparedStatementLogger.invoke(PreparedStatementLogger.java:58) + at jdk.proxy4/jdk.proxy4.$Proxy115.execute(Unknown Source) + at org.apache.ibatis.executor.statement.PreparedStatementHandler.query(PreparedStatementHandler.java:65) + at org.apache.ibatis.executor.statement.RoutingStatementHandler.query(RoutingStatementHandler.java:80) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:569) + at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:61) + at jdk.proxy2/jdk.proxy2.$Proxy113.query(Unknown Source) + at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:65) + at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:336) + at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:158) + at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:110) + at com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor.willDoQuery(PaginationInnerInterceptor.java:141) + at com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor.intercept(MybatisPlusInterceptor.java:75) + at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:59) + at jdk.proxy2/jdk.proxy2.$Proxy112.query(Unknown Source) + at com.github.pagehelper.PageInterceptor.intercept(PageInterceptor.java:108) + at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:59) + at jdk.proxy2/jdk.proxy2.$Proxy112.query(Unknown Source) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:154) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:147) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:142) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:569) + at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:427) + ... 106 common frames omitted + +2025-04-17 10:39:32.218 WARN 8424 --- [http-nio-9092-exec-2] .m.m.a.ExceptionHandlerExceptionResolver : Resolved [org.springframework.jdbc.BadSqlGrammarException: +### Error querying database. Cause: java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') FROM learningResources WHERE (category_id = 1)' at line 1 +### The error may exist in com/mingchen/mapper/LearningResourcesMapper.java (best guess) +### The error may involve defaultParameterMap +### The error occurred while setting parameters +### SQL: SELECT COUNT() FROM learningResources WHERE (category_id = ?) +### Cause: java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') FROM learningResources WHERE (category_id = 1)' at line 1 +; bad SQL grammar []; nested exception is java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') FROM learningResources WHERE (category_id = 1)' at line 1] +2025-04-17 10:43:32.146 DEBUG 8424 --- [http-nio-9092-exec-4] c.m.m.L.selectList_mpCount : ==> Preparing: SELECT COUNT() FROM learningResources WHERE (category_id = ?) +2025-04-17 10:43:32.148 DEBUG 8424 --- [http-nio-9092-exec-4] c.m.m.L.selectList_mpCount : ==> Parameters: 1(Integer) +2025-04-17 10:43:34.223 ERROR 8424 --- [http-nio-9092-exec-4] c.m.c.h.ControllerExceptionHandler : Request URL : http://localhost:9092/admin/learningResources/page, Exception : + +org.springframework.jdbc.BadSqlGrammarException: +### Error querying database. Cause: java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') FROM learningResources WHERE (category_id = 1)' at line 1 +### The error may exist in com/mingchen/mapper/LearningResourcesMapper.java (best guess) +### The error may involve defaultParameterMap +### The error occurred while setting parameters +### SQL: SELECT COUNT() FROM learningResources WHERE (category_id = ?) +### Cause: java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') FROM learningResources WHERE (category_id = 1)' at line 1 +; bad SQL grammar []; nested exception is java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') FROM learningResources WHERE (category_id = 1)' at line 1 + at org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.doTranslate(SQLErrorCodeSQLExceptionTranslator.java:235) + at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:72) + at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:91) + at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:441) + at jdk.proxy2/jdk.proxy2.$Proxy85.selectList(Unknown Source) + at org.mybatis.spring.SqlSessionTemplate.selectList(SqlSessionTemplate.java:224) + at com.baomidou.mybatisplus.core.override.MybatisMapperMethod.executeForMany(MybatisMapperMethod.java:164) + at com.baomidou.mybatisplus.core.override.MybatisMapperMethod.execute(MybatisMapperMethod.java:77) + at com.baomidou.mybatisplus.core.override.MybatisMapperProxy$PlainMethodInvoker.invoke(MybatisMapperProxy.java:152) + at com.baomidou.mybatisplus.core.override.MybatisMapperProxy.invoke(MybatisMapperProxy.java:89) + at jdk.proxy3/jdk.proxy3.$Proxy88.selectList(Unknown Source) + at com.baomidou.mybatisplus.core.mapper.BaseMapper.selectPage(BaseMapper.java:348) + at java.base/java.lang.invoke.MethodHandle.invokeWithArguments(MethodHandle.java:732) + at com.baomidou.mybatisplus.core.override.MybatisMapperProxy$DefaultMethodInvoker.invoke(MybatisMapperProxy.java:166) + at com.baomidou.mybatisplus.core.override.MybatisMapperProxy.invoke(MybatisMapperProxy.java:89) + at jdk.proxy3/jdk.proxy3.$Proxy88.selectPage(Unknown Source) + at com.mingchen.service.impl.LearningResourcesServiceImpl.getLearningResources(LearningResourcesServiceImpl.java:40) + at com.mingchen.service.impl.LearningResourcesServiceImpl$$FastClassBySpringCGLIB$$d7671a85.invoke() + at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) + at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:687) + at com.mingchen.service.impl.LearningResourcesServiceImpl$$EnhancerBySpringCGLIB$$98442bc2.getLearningResources() + at com.mingchen.api.open.LearningResourcesController.getLearningResources(LearningResourcesController.java:32) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:569) + at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:190) + at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:138) + at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:105) + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:879) + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:793) + at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) + at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1040) + at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943) + at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) + at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898) + at javax.servlet.http.HttpServlet.service(HttpServlet.java:503) + at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) + at javax.servlet.http.HttpServlet.service(HttpServlet.java:590) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:320) + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:126) + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:90) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:118) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:137) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:111) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:158) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at com.mingchen.common.config.JwtFilter.doFilter(JwtFilter.java:68) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:200) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:116) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:92) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:92) + at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:77) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:105) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:56) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:215) + at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:178) + at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:358) + at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:271) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202) + at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) + at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541) + at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139) + at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) + at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) + at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) + at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:373) + at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) + at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868) + at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1590) + at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) + at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) + at java.base/java.lang.Thread.run(Thread.java:840) +Caused by: java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') FROM learningResources WHERE (category_id = 1)' at line 1 + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:120) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:97) + at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122) + at com.mysql.cj.jdbc.ClientPreparedStatement.executeInternal(ClientPreparedStatement.java:953) + at com.mysql.cj.jdbc.ClientPreparedStatement.execute(ClientPreparedStatement.java:370) + at com.zaxxer.hikari.pool.ProxyPreparedStatement.execute(ProxyPreparedStatement.java:44) + at com.zaxxer.hikari.pool.HikariProxyPreparedStatement.execute(HikariProxyPreparedStatement.java) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:569) + at org.apache.ibatis.logging.jdbc.PreparedStatementLogger.invoke(PreparedStatementLogger.java:58) + at jdk.proxy4/jdk.proxy4.$Proxy115.execute(Unknown Source) + at org.apache.ibatis.executor.statement.PreparedStatementHandler.query(PreparedStatementHandler.java:65) + at org.apache.ibatis.executor.statement.RoutingStatementHandler.query(RoutingStatementHandler.java:80) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:569) + at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:61) + at jdk.proxy2/jdk.proxy2.$Proxy113.query(Unknown Source) + at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:65) + at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:336) + at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:158) + at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:110) + at com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor.willDoQuery(PaginationInnerInterceptor.java:141) + at com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor.intercept(MybatisPlusInterceptor.java:75) + at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:59) + at jdk.proxy2/jdk.proxy2.$Proxy112.query(Unknown Source) + at com.github.pagehelper.PageInterceptor.intercept(PageInterceptor.java:108) + at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:59) + at jdk.proxy2/jdk.proxy2.$Proxy112.query(Unknown Source) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:154) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:147) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:142) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:569) + at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:427) + ... 106 common frames omitted + +2025-04-17 10:43:34.225 WARN 8424 --- [http-nio-9092-exec-4] .m.m.a.ExceptionHandlerExceptionResolver : Resolved [org.springframework.jdbc.BadSqlGrammarException: +### Error querying database. Cause: java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') FROM learningResources WHERE (category_id = 1)' at line 1 +### The error may exist in com/mingchen/mapper/LearningResourcesMapper.java (best guess) +### The error may involve defaultParameterMap +### The error occurred while setting parameters +### SQL: SELECT COUNT() FROM learningResources WHERE (category_id = ?) +### Cause: java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') FROM learningResources WHERE (category_id = 1)' at line 1 +; bad SQL grammar []; nested exception is java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') FROM learningResources WHERE (category_id = 1)' at line 1] +2025-04-17 10:45:33.025 INFO 8424 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED paused. +2025-04-17 10:45:33.027 INFO 8424 --- [SpringContextShutdownHook] o.s.s.quartz.SchedulerFactoryBean : Shutting down Quartz Scheduler +2025-04-17 10:45:33.027 INFO 8424 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED shutting down. +2025-04-17 10:45:33.027 INFO 8424 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED paused. +2025-04-17 10:45:33.027 INFO 8424 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED shutdown complete. +2025-04-17 10:45:33.027 INFO 8424 --- [SpringContextShutdownHook] o.s.s.concurrent.ThreadPoolTaskExecutor : Shutting down ExecutorService 'applicationTaskExecutor' +2025-04-17 10:45:33.033 INFO 8424 --- [SpringContextShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown initiated... +2025-04-17 10:45:33.036 INFO 8424 --- [SpringContextShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown completed. +2025-04-17 10:45:35.266 INFO 8763 --- [restartedMain] com.mingchen.BlogApiApplication : Starting BlogApiApplication on mingchendeMac-mini.local with PID 8763 (/Users/mingchen/code/java/other/legalAid/api/target/classes started by mingchen in /Users/mingchen/code/java/other/legalAid) +2025-04-17 10:45:35.267 DEBUG 8763 --- [restartedMain] com.mingchen.BlogApiApplication : Running with Spring Boot v2.2.7.RELEASE, Spring v5.2.6.RELEASE +2025-04-17 10:45:35.267 INFO 8763 --- [restartedMain] com.mingchen.BlogApiApplication : The following profiles are active: dev +2025-04-17 10:45:35.284 INFO 8763 --- [restartedMain] o.s.b.devtools.restart.ChangeableUrls : The Class-Path manifest attribute in /usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/jaxb-runtime-2.3.1.jar referenced one or more files that do not exist: file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/jaxb-api-2.3.1.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/txw2-2.3.1.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/istack-commons-runtime-3.0.7.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/stax-ex-1.8.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/FastInfoset-1.2.15.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/javax.activation-api-1.2.0.jar +2025-04-17 10:45:35.285 INFO 8763 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : Devtools property defaults active! Set 'spring.devtools.add-properties' to 'false' to disable +2025-04-17 10:45:35.285 INFO 8763 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : For additional web related logging consider setting the 'logging.level.web' property to 'DEBUG' +2025-04-17 10:45:35.492 INFO 8763 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Multiple Spring Data modules found, entering strict repository configuration mode! +2025-04-17 10:45:35.493 INFO 8763 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data Redis repositories in DEFAULT mode. +2025-04-17 10:45:35.503 INFO 8763 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 7ms. Found 0 Redis repository interfaces. +2025-04-17 10:45:35.755 INFO 8763 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 9092 (http) +2025-04-17 10:45:35.759 INFO 8763 --- [restartedMain] o.apache.catalina.core.StandardService : Starting service [Tomcat] +2025-04-17 10:45:35.759 INFO 8763 --- [restartedMain] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.34] +2025-04-17 10:45:35.781 INFO 8763 --- [restartedMain] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext +2025-04-17 10:45:35.781 INFO 8763 --- [restartedMain] o.s.web.context.ContextLoader : Root WebApplicationContext: initialization completed in 496 ms +2025-04-17 10:45:36.281 INFO 8763 --- [restartedMain] n.b.p.u.AbstractUserAgentAnalyzerDirect : - Loaded 90 files in 205 msec using expression: classpath*:UserAgents/**/*.yaml +2025-04-17 10:45:36.281 INFO 8763 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : +2025-04-17 10:45:36.281 INFO 8763 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : /-----------------------------------------------------------\ +2025-04-17 10:45:36.281 INFO 8763 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : | Yauaa 5.20 (v5.20 @ 2020-11-22T15:39:16Z) | +2025-04-17 10:45:36.281 INFO 8763 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : +-----------------------------------------------------------+ +2025-04-17 10:45:36.281 INFO 8763 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : | For more information: https://yauaa.basjes.nl | +2025-04-17 10:45:36.281 INFO 8763 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : | Copyright (C) 2013-2020 Niels Basjes - License Apache 2.0 | +2025-04-17 10:45:36.282 INFO 8763 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : \-----------------------------------------------------------/ +2025-04-17 10:45:36.282 INFO 8763 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : +2025-04-17 10:45:36.284 INFO 8763 --- [restartedMain] n.b.p.u.AbstractUserAgentAnalyzerDirect : Building all needed matchers for the requested 11 fields. +2025-04-17 10:45:36.334 INFO 8763 --- [restartedMain] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor' +2025-04-17 10:45:36.407 INFO 8763 --- [restartedMain] org.quartz.impl.StdSchedulerFactory : Using default implementation for ThreadExecutor +2025-04-17 10:45:36.411 INFO 8763 --- [restartedMain] org.quartz.core.SchedulerSignalerImpl : Initialized Scheduler Signaller of type: class org.quartz.core.SchedulerSignalerImpl +2025-04-17 10:45:36.411 INFO 8763 --- [restartedMain] org.quartz.core.QuartzScheduler : Quartz Scheduler v.2.3.2 created. +2025-04-17 10:45:36.411 INFO 8763 --- [restartedMain] org.quartz.simpl.RAMJobStore : RAMJobStore initialized. +2025-04-17 10:45:36.411 INFO 8763 --- [restartedMain] org.quartz.core.QuartzScheduler : Scheduler meta-data: Quartz Scheduler (v2.3.2) 'quartzScheduler' with instanceId 'NON_CLUSTERED' + Scheduler class: 'org.quartz.core.QuartzScheduler' - running locally. + NOT STARTED. + Currently in standby mode. + Number of jobs executed: 0 + Using thread pool 'org.quartz.simpl.SimpleThreadPool' - with 10 threads. + Using job-store 'org.quartz.simpl.RAMJobStore' - which does not support persistence. and is not clustered. + +2025-04-17 10:45:36.411 INFO 8763 --- [restartedMain] org.quartz.impl.StdSchedulerFactory : Quartz scheduler 'quartzScheduler' initialized from an externally provided properties instance. +2025-04-17 10:45:36.411 INFO 8763 --- [restartedMain] org.quartz.impl.StdSchedulerFactory : Quartz scheduler version: 2.3.2 +2025-04-17 10:45:36.411 INFO 8763 --- [restartedMain] org.quartz.core.QuartzScheduler : JobFactory set to: org.springframework.scheduling.quartz.SpringBeanJobFactory@46a56241 +2025-04-17 10:45:36.440 INFO 8763 --- [restartedMain] o.s.s.web.DefaultSecurityFilterChain : Creating filter chain: any request, [org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter@5869ab2e, org.springframework.security.web.context.SecurityContextPersistenceFilter@20afabc, org.springframework.security.web.header.HeaderWriterFilter@4f2668fb, org.springframework.web.filter.CorsFilter@4808e015, org.springframework.security.web.authentication.logout.LogoutFilter@245c6d9e, com.mingchen.common.config.JwtLoginFilter@534561d5, com.mingchen.common.config.JwtFilter@62f181d, org.springframework.security.web.savedrequest.RequestCacheAwareFilter@5eefe7ff, org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter@5ea56428, org.springframework.security.web.authentication.AnonymousAuthenticationFilter@138af32d, org.springframework.security.web.session.SessionManagementFilter@6db16991, org.springframework.security.web.access.ExceptionTranslationFilter@4ca6c712, org.springframework.security.web.access.intercept.FilterSecurityInterceptor@3f825f69] +2025-04-17 10:45:36.451 INFO 8763 --- [restartedMain] o.s.b.d.a.OptionalLiveReloadServer : LiveReload server is running on port 35729 +2025-04-17 10:45:36.459 INFO 8763 --- [restartedMain] o.s.s.quartz.SchedulerFactoryBean : Starting Quartz Scheduler now +2025-04-17 10:45:36.459 INFO 8763 --- [restartedMain] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED started. +2025-04-17 10:45:36.467 INFO 8763 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 9092 (http) with context path '' +2025-04-17 10:45:36.469 INFO 8763 --- [restartedMain] com.mingchen.BlogApiApplication : Started BlogApiApplication in 1.355 seconds (JVM running for 1.588) +2025-04-17 10:45:41.581 INFO 8763 --- [http-nio-9092-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet' +2025-04-17 10:45:41.581 INFO 8763 --- [http-nio-9092-exec-1] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet' +2025-04-17 10:45:41.590 INFO 8763 --- [http-nio-9092-exec-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 8 ms +2025-04-17 10:45:43.446 INFO 8763 --- [http-nio-9092-exec-1] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting... +2025-04-17 10:45:44.268 INFO 8763 --- [http-nio-9092-exec-1] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed. +2025-04-17 10:45:44.304 DEBUG 8763 --- [http-nio-9092-exec-1] c.m.m.L.selectList_mpCount : ==> Preparing: SELECT COUNT() FROM learning_resources WHERE (category_id = ?) +2025-04-17 10:45:44.427 DEBUG 8763 --- [http-nio-9092-exec-1] c.m.m.L.selectList_mpCount : ==> Parameters: 1(Integer) +2025-04-17 10:45:47.428 ERROR 8763 --- [http-nio-9092-exec-1] c.m.c.h.ControllerExceptionHandler : Request URL : http://localhost:9092/admin/learningResources/page, Exception : + +org.springframework.jdbc.BadSqlGrammarException: +### Error querying database. Cause: java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') FROM learning_resources WHERE (category_id = 1)' at line 1 +### The error may exist in com/mingchen/mapper/LearningResourcesMapper.java (best guess) +### The error may involve defaultParameterMap +### The error occurred while setting parameters +### SQL: SELECT COUNT() FROM learning_resources WHERE (category_id = ?) +### Cause: java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') FROM learning_resources WHERE (category_id = 1)' at line 1 +; bad SQL grammar []; nested exception is java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') FROM learning_resources WHERE (category_id = 1)' at line 1 + at org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.doTranslate(SQLErrorCodeSQLExceptionTranslator.java:235) + at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:72) + at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:91) + at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:441) + at jdk.proxy2/jdk.proxy2.$Proxy85.selectList(Unknown Source) + at org.mybatis.spring.SqlSessionTemplate.selectList(SqlSessionTemplate.java:224) + at com.baomidou.mybatisplus.core.override.MybatisMapperMethod.executeForMany(MybatisMapperMethod.java:164) + at com.baomidou.mybatisplus.core.override.MybatisMapperMethod.execute(MybatisMapperMethod.java:77) + at com.baomidou.mybatisplus.core.override.MybatisMapperProxy$PlainMethodInvoker.invoke(MybatisMapperProxy.java:152) + at com.baomidou.mybatisplus.core.override.MybatisMapperProxy.invoke(MybatisMapperProxy.java:89) + at jdk.proxy3/jdk.proxy3.$Proxy88.selectList(Unknown Source) + at com.baomidou.mybatisplus.core.mapper.BaseMapper.selectPage(BaseMapper.java:348) + at java.base/java.lang.invoke.MethodHandle.invokeWithArguments(MethodHandle.java:732) + at com.baomidou.mybatisplus.core.override.MybatisMapperProxy$DefaultMethodInvoker.invoke(MybatisMapperProxy.java:166) + at com.baomidou.mybatisplus.core.override.MybatisMapperProxy.invoke(MybatisMapperProxy.java:89) + at jdk.proxy3/jdk.proxy3.$Proxy88.selectPage(Unknown Source) + at com.mingchen.service.impl.LearningResourcesServiceImpl.getLearningResources(LearningResourcesServiceImpl.java:40) + at com.mingchen.service.impl.LearningResourcesServiceImpl$$FastClassBySpringCGLIB$$d7671a85.invoke() + at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) + at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:687) + at com.mingchen.service.impl.LearningResourcesServiceImpl$$EnhancerBySpringCGLIB$$254b81f.getLearningResources() + at com.mingchen.api.open.LearningResourcesController.getLearningResources(LearningResourcesController.java:32) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:569) + at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:190) + at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:138) + at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:105) + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:879) + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:793) + at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) + at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1040) + at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943) + at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) + at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898) + at javax.servlet.http.HttpServlet.service(HttpServlet.java:503) + at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) + at javax.servlet.http.HttpServlet.service(HttpServlet.java:590) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:320) + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:126) + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:90) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:118) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:137) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:111) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:158) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at com.mingchen.common.config.JwtFilter.doFilter(JwtFilter.java:68) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:200) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:116) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:92) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:92) + at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:77) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:105) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:56) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:215) + at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:178) + at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:358) + at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:271) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202) + at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) + at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541) + at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139) + at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) + at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) + at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) + at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:373) + at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) + at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868) + at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1590) + at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) + at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) + at java.base/java.lang.Thread.run(Thread.java:840) +Caused by: java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') FROM learning_resources WHERE (category_id = 1)' at line 1 + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:120) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:97) + at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122) + at com.mysql.cj.jdbc.ClientPreparedStatement.executeInternal(ClientPreparedStatement.java:953) + at com.mysql.cj.jdbc.ClientPreparedStatement.execute(ClientPreparedStatement.java:370) + at com.zaxxer.hikari.pool.ProxyPreparedStatement.execute(ProxyPreparedStatement.java:44) + at com.zaxxer.hikari.pool.HikariProxyPreparedStatement.execute(HikariProxyPreparedStatement.java) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:569) + at org.apache.ibatis.logging.jdbc.PreparedStatementLogger.invoke(PreparedStatementLogger.java:58) + at jdk.proxy4/jdk.proxy4.$Proxy115.execute(Unknown Source) + at org.apache.ibatis.executor.statement.PreparedStatementHandler.query(PreparedStatementHandler.java:65) + at org.apache.ibatis.executor.statement.RoutingStatementHandler.query(RoutingStatementHandler.java:80) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:569) + at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:61) + at jdk.proxy2/jdk.proxy2.$Proxy113.query(Unknown Source) + at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:65) + at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:336) + at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:158) + at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:110) + at com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor.willDoQuery(PaginationInnerInterceptor.java:141) + at com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor.intercept(MybatisPlusInterceptor.java:75) + at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:59) + at jdk.proxy2/jdk.proxy2.$Proxy112.query(Unknown Source) + at com.github.pagehelper.PageInterceptor.intercept(PageInterceptor.java:108) + at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:59) + at jdk.proxy2/jdk.proxy2.$Proxy112.query(Unknown Source) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:154) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:147) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:142) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:569) + at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:427) + ... 106 common frames omitted + +2025-04-17 10:45:47.451 WARN 8763 --- [http-nio-9092-exec-1] .m.m.a.ExceptionHandlerExceptionResolver : Resolved [org.springframework.jdbc.BadSqlGrammarException: +### Error querying database. Cause: java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') FROM learning_resources WHERE (category_id = 1)' at line 1 +### The error may exist in com/mingchen/mapper/LearningResourcesMapper.java (best guess) +### The error may involve defaultParameterMap +### The error occurred while setting parameters +### SQL: SELECT COUNT() FROM learning_resources WHERE (category_id = ?) +### Cause: java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') FROM learning_resources WHERE (category_id = 1)' at line 1 +; bad SQL grammar []; nested exception is java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') FROM learning_resources WHERE (category_id = 1)' at line 1] +2025-04-17 10:46:38.304 INFO 8763 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED paused. +2025-04-17 10:46:38.305 INFO 8763 --- [SpringContextShutdownHook] o.s.s.quartz.SchedulerFactoryBean : Shutting down Quartz Scheduler +2025-04-17 10:46:38.305 INFO 8763 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED shutting down. +2025-04-17 10:46:38.305 INFO 8763 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED paused. +2025-04-17 10:46:38.305 INFO 8763 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED shutdown complete. +2025-04-17 10:46:38.306 INFO 8763 --- [SpringContextShutdownHook] o.s.s.concurrent.ThreadPoolTaskExecutor : Shutting down ExecutorService 'applicationTaskExecutor' +2025-04-17 10:46:38.312 INFO 8763 --- [SpringContextShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown initiated... +2025-04-17 10:46:38.314 INFO 8763 --- [SpringContextShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown completed. +2025-04-17 10:46:54.573 INFO 8845 --- [restartedMain] com.mingchen.BlogApiApplication : Starting BlogApiApplication on mingchendeMac-mini.local with PID 8845 (/Users/mingchen/code/java/other/legalAid/api/target/classes started by mingchen in /Users/mingchen/code/java/other/legalAid) +2025-04-17 10:46:54.574 DEBUG 8845 --- [restartedMain] com.mingchen.BlogApiApplication : Running with Spring Boot v2.2.7.RELEASE, Spring v5.2.6.RELEASE +2025-04-17 10:46:54.574 INFO 8845 --- [restartedMain] com.mingchen.BlogApiApplication : The following profiles are active: dev +2025-04-17 10:46:54.601 INFO 8845 --- [restartedMain] o.s.b.devtools.restart.ChangeableUrls : The Class-Path manifest attribute in /usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/jaxb-runtime-2.3.1.jar referenced one or more files that do not exist: file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/jaxb-api-2.3.1.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/txw2-2.3.1.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/istack-commons-runtime-3.0.7.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/stax-ex-1.8.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/FastInfoset-1.2.15.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/javax.activation-api-1.2.0.jar +2025-04-17 10:46:54.602 INFO 8845 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : Devtools property defaults active! Set 'spring.devtools.add-properties' to 'false' to disable +2025-04-17 10:46:54.602 INFO 8845 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : For additional web related logging consider setting the 'logging.level.web' property to 'DEBUG' +2025-04-17 10:46:54.823 INFO 8845 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Multiple Spring Data modules found, entering strict repository configuration mode! +2025-04-17 10:46:54.824 INFO 8845 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data Redis repositories in DEFAULT mode. +2025-04-17 10:46:54.836 INFO 8845 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 7ms. Found 0 Redis repository interfaces. +2025-04-17 10:46:55.109 INFO 8845 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 9092 (http) +2025-04-17 10:46:55.113 INFO 8845 --- [restartedMain] o.apache.catalina.core.StandardService : Starting service [Tomcat] +2025-04-17 10:46:55.113 INFO 8845 --- [restartedMain] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.34] +2025-04-17 10:46:55.139 INFO 8845 --- [restartedMain] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext +2025-04-17 10:46:55.139 INFO 8845 --- [restartedMain] o.s.web.context.ContextLoader : Root WebApplicationContext: initialization completed in 537 ms +2025-04-17 10:46:55.679 INFO 8845 --- [restartedMain] n.b.p.u.AbstractUserAgentAnalyzerDirect : - Loaded 90 files in 220 msec using expression: classpath*:UserAgents/**/*.yaml +2025-04-17 10:46:55.679 INFO 8845 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : +2025-04-17 10:46:55.679 INFO 8845 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : /-----------------------------------------------------------\ +2025-04-17 10:46:55.679 INFO 8845 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : | Yauaa 5.20 (v5.20 @ 2020-11-22T15:39:16Z) | +2025-04-17 10:46:55.679 INFO 8845 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : +-----------------------------------------------------------+ +2025-04-17 10:46:55.679 INFO 8845 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : | For more information: https://yauaa.basjes.nl | +2025-04-17 10:46:55.679 INFO 8845 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : | Copyright (C) 2013-2020 Niels Basjes - License Apache 2.0 | +2025-04-17 10:46:55.679 INFO 8845 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : \-----------------------------------------------------------/ +2025-04-17 10:46:55.679 INFO 8845 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : +2025-04-17 10:46:55.684 INFO 8845 --- [restartedMain] n.b.p.u.AbstractUserAgentAnalyzerDirect : Building all needed matchers for the requested 11 fields. +2025-04-17 10:46:55.739 INFO 8845 --- [restartedMain] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor' +2025-04-17 10:46:55.820 INFO 8845 --- [restartedMain] org.quartz.impl.StdSchedulerFactory : Using default implementation for ThreadExecutor +2025-04-17 10:46:55.824 INFO 8845 --- [restartedMain] org.quartz.core.SchedulerSignalerImpl : Initialized Scheduler Signaller of type: class org.quartz.core.SchedulerSignalerImpl +2025-04-17 10:46:55.824 INFO 8845 --- [restartedMain] org.quartz.core.QuartzScheduler : Quartz Scheduler v.2.3.2 created. +2025-04-17 10:46:55.825 INFO 8845 --- [restartedMain] org.quartz.simpl.RAMJobStore : RAMJobStore initialized. +2025-04-17 10:46:55.825 INFO 8845 --- [restartedMain] org.quartz.core.QuartzScheduler : Scheduler meta-data: Quartz Scheduler (v2.3.2) 'quartzScheduler' with instanceId 'NON_CLUSTERED' + Scheduler class: 'org.quartz.core.QuartzScheduler' - running locally. + NOT STARTED. + Currently in standby mode. + Number of jobs executed: 0 + Using thread pool 'org.quartz.simpl.SimpleThreadPool' - with 10 threads. + Using job-store 'org.quartz.simpl.RAMJobStore' - which does not support persistence. and is not clustered. + +2025-04-17 10:46:55.825 INFO 8845 --- [restartedMain] org.quartz.impl.StdSchedulerFactory : Quartz scheduler 'quartzScheduler' initialized from an externally provided properties instance. +2025-04-17 10:46:55.825 INFO 8845 --- [restartedMain] org.quartz.impl.StdSchedulerFactory : Quartz scheduler version: 2.3.2 +2025-04-17 10:46:55.825 INFO 8845 --- [restartedMain] org.quartz.core.QuartzScheduler : JobFactory set to: org.springframework.scheduling.quartz.SpringBeanJobFactory@e4ae648 +2025-04-17 10:46:55.857 INFO 8845 --- [restartedMain] o.s.s.web.DefaultSecurityFilterChain : Creating filter chain: any request, [org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter@46e82817, org.springframework.security.web.context.SecurityContextPersistenceFilter@78ffc18c, org.springframework.security.web.header.HeaderWriterFilter@7a0fd989, org.springframework.web.filter.CorsFilter@6bd0ab96, org.springframework.security.web.authentication.logout.LogoutFilter@7870c00a, com.mingchen.common.config.JwtLoginFilter@145fb87c, com.mingchen.common.config.JwtFilter@3df58f9b, org.springframework.security.web.savedrequest.RequestCacheAwareFilter@3582d263, org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter@113a0845, org.springframework.security.web.authentication.AnonymousAuthenticationFilter@3a5ab0a2, org.springframework.security.web.session.SessionManagementFilter@2b4079b0, org.springframework.security.web.access.ExceptionTranslationFilter@1ab5111b, org.springframework.security.web.access.intercept.FilterSecurityInterceptor@567cdbbe] +2025-04-17 10:46:55.873 INFO 8845 --- [restartedMain] o.s.b.d.a.OptionalLiveReloadServer : LiveReload server is running on port 35729 +2025-04-17 10:46:55.882 INFO 8845 --- [restartedMain] o.s.s.quartz.SchedulerFactoryBean : Starting Quartz Scheduler now +2025-04-17 10:46:55.882 INFO 8845 --- [restartedMain] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED started. +2025-04-17 10:46:55.891 INFO 8845 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 9092 (http) with context path '' +2025-04-17 10:46:55.894 INFO 8845 --- [restartedMain] com.mingchen.BlogApiApplication : Started BlogApiApplication in 1.58 seconds (JVM running for 2.137) +2025-04-17 10:47:04.336 INFO 8845 --- [http-nio-9092-exec-2] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet' +2025-04-17 10:47:04.336 INFO 8845 --- [http-nio-9092-exec-2] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet' +2025-04-17 10:47:04.338 INFO 8845 --- [http-nio-9092-exec-2] o.s.web.servlet.DispatcherServlet : Completed initialization in 2 ms +2025-04-17 10:47:07.378 INFO 8845 --- [http-nio-9092-exec-2] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting... +2025-04-17 10:47:08.209 INFO 8845 --- [http-nio-9092-exec-2] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed. +2025-04-17 10:47:08.260 DEBUG 8845 --- [http-nio-9092-exec-2] c.m.m.L.selectList_mpCount : ==> Preparing: SELECT COUNT() FROM learning_resources WHERE (category_id = ?) +2025-04-17 10:47:08.373 DEBUG 8845 --- [http-nio-9092-exec-2] c.m.m.L.selectList_mpCount : ==> Parameters: 1(Integer) +2025-04-17 10:47:51.023 ERROR 8845 --- [http-nio-9092-exec-2] c.m.c.h.ControllerExceptionHandler : Request URL : http://localhost:9092/admin/learningResources/page, Exception : + +org.springframework.jdbc.BadSqlGrammarException: +### Error querying database. Cause: java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') FROM learning_resources WHERE (category_id = 1)' at line 1 +### The error may exist in com/mingchen/mapper/LearningResourcesMapper.java (best guess) +### The error may involve defaultParameterMap +### The error occurred while setting parameters +### SQL: SELECT COUNT() FROM learning_resources WHERE (category_id = ?) +### Cause: java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') FROM learning_resources WHERE (category_id = 1)' at line 1 +; bad SQL grammar []; nested exception is java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') FROM learning_resources WHERE (category_id = 1)' at line 1 + at org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.doTranslate(SQLErrorCodeSQLExceptionTranslator.java:235) + at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:72) + at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:91) + at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:441) + at jdk.proxy2/jdk.proxy2.$Proxy85.selectList(Unknown Source) + at org.mybatis.spring.SqlSessionTemplate.selectList(SqlSessionTemplate.java:224) + at com.baomidou.mybatisplus.core.override.MybatisMapperMethod.executeForMany(MybatisMapperMethod.java:164) + at com.baomidou.mybatisplus.core.override.MybatisMapperMethod.execute(MybatisMapperMethod.java:77) + at com.baomidou.mybatisplus.core.override.MybatisMapperProxy$PlainMethodInvoker.invoke(MybatisMapperProxy.java:152) + at com.baomidou.mybatisplus.core.override.MybatisMapperProxy.invoke(MybatisMapperProxy.java:89) + at jdk.proxy3/jdk.proxy3.$Proxy88.selectList(Unknown Source) + at com.baomidou.mybatisplus.core.mapper.BaseMapper.selectPage(BaseMapper.java:348) + at java.base/java.lang.invoke.MethodHandle.invokeWithArguments(MethodHandle.java:732) + at com.baomidou.mybatisplus.core.override.MybatisMapperProxy$DefaultMethodInvoker.invoke(MybatisMapperProxy.java:166) + at com.baomidou.mybatisplus.core.override.MybatisMapperProxy.invoke(MybatisMapperProxy.java:89) + at jdk.proxy3/jdk.proxy3.$Proxy88.selectPage(Unknown Source) + at com.mingchen.service.impl.LearningResourcesServiceImpl.getLearningResources(LearningResourcesServiceImpl.java:40) + at com.mingchen.service.impl.LearningResourcesServiceImpl$$FastClassBySpringCGLIB$$d7671a85.invoke() + at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) + at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:687) + at com.mingchen.service.impl.LearningResourcesServiceImpl$$EnhancerBySpringCGLIB$$3aa92654.getLearningResources() + at com.mingchen.api.open.LearningResourcesController.getLearningResources(LearningResourcesController.java:32) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:569) + at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:190) + at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:138) + at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:105) + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:879) + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:793) + at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) + at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1040) + at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943) + at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) + at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898) + at javax.servlet.http.HttpServlet.service(HttpServlet.java:503) + at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) + at javax.servlet.http.HttpServlet.service(HttpServlet.java:590) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:320) + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:126) + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:90) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:118) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:137) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:111) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:158) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at com.mingchen.common.config.JwtFilter.doFilter(JwtFilter.java:68) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:200) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:116) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:92) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:92) + at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:77) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:105) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:56) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:215) + at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:178) + at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:358) + at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:271) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202) + at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) + at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541) + at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139) + at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) + at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) + at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) + at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:373) + at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) + at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868) + at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1590) + at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) + at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) + at java.base/java.lang.Thread.run(Thread.java:840) +Caused by: java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') FROM learning_resources WHERE (category_id = 1)' at line 1 + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:120) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:97) + at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122) + at com.mysql.cj.jdbc.ClientPreparedStatement.executeInternal(ClientPreparedStatement.java:953) + at com.mysql.cj.jdbc.ClientPreparedStatement.execute(ClientPreparedStatement.java:370) + at com.zaxxer.hikari.pool.ProxyPreparedStatement.execute(ProxyPreparedStatement.java:44) + at com.zaxxer.hikari.pool.HikariProxyPreparedStatement.execute(HikariProxyPreparedStatement.java) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:569) + at org.apache.ibatis.logging.jdbc.PreparedStatementLogger.invoke(PreparedStatementLogger.java:58) + at jdk.proxy4/jdk.proxy4.$Proxy115.execute(Unknown Source) + at org.apache.ibatis.executor.statement.PreparedStatementHandler.query(PreparedStatementHandler.java:65) + at org.apache.ibatis.executor.statement.RoutingStatementHandler.query(RoutingStatementHandler.java:80) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:569) + at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:61) + at jdk.proxy2/jdk.proxy2.$Proxy113.query(Unknown Source) + at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:65) + at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:336) + at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:158) + at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:110) + at com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor.willDoQuery(PaginationInnerInterceptor.java:141) + at com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor.intercept(MybatisPlusInterceptor.java:75) + at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:59) + at jdk.proxy2/jdk.proxy2.$Proxy112.query(Unknown Source) + at com.github.pagehelper.PageInterceptor.intercept(PageInterceptor.java:108) + at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:59) + at jdk.proxy2/jdk.proxy2.$Proxy112.query(Unknown Source) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:154) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:147) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:142) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:569) + at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:427) + ... 106 common frames omitted + +2025-04-17 10:47:51.047 WARN 8845 --- [http-nio-9092-exec-2] .m.m.a.ExceptionHandlerExceptionResolver : Resolved [org.springframework.jdbc.BadSqlGrammarException: +### Error querying database. Cause: java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') FROM learning_resources WHERE (category_id = 1)' at line 1 +### The error may exist in com/mingchen/mapper/LearningResourcesMapper.java (best guess) +### The error may involve defaultParameterMap +### The error occurred while setting parameters +### SQL: SELECT COUNT() FROM learning_resources WHERE (category_id = ?) +### Cause: java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') FROM learning_resources WHERE (category_id = 1)' at line 1 +; bad SQL grammar []; nested exception is java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') FROM learning_resources WHERE (category_id = 1)' at line 1] +2025-04-17 10:54:26.649 INFO 8845 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED paused. +2025-04-17 10:54:26.651 INFO 8845 --- [SpringContextShutdownHook] o.s.s.quartz.SchedulerFactoryBean : Shutting down Quartz Scheduler +2025-04-17 10:54:26.651 INFO 8845 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED shutting down. +2025-04-17 10:54:26.651 INFO 8845 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED paused. +2025-04-17 10:54:26.651 INFO 8845 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED shutdown complete. +2025-04-17 10:54:26.651 INFO 8845 --- [SpringContextShutdownHook] o.s.s.concurrent.ThreadPoolTaskExecutor : Shutting down ExecutorService 'applicationTaskExecutor' +2025-04-17 10:54:26.658 INFO 8845 --- [SpringContextShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown initiated... +2025-04-17 10:54:26.660 INFO 8845 --- [SpringContextShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown completed. +2025-04-17 10:54:29.615 INFO 9244 --- [restartedMain] com.mingchen.BlogApiApplication : Starting BlogApiApplication on mingchendeMac-mini.local with PID 9244 (/Users/mingchen/code/java/other/legalAid/api/target/classes started by mingchen in /Users/mingchen/code/java/other/legalAid) +2025-04-17 10:54:29.616 DEBUG 9244 --- [restartedMain] com.mingchen.BlogApiApplication : Running with Spring Boot v2.2.7.RELEASE, Spring v5.2.6.RELEASE +2025-04-17 10:54:29.616 INFO 9244 --- [restartedMain] com.mingchen.BlogApiApplication : The following profiles are active: dev +2025-04-17 10:54:29.632 INFO 9244 --- [restartedMain] o.s.b.devtools.restart.ChangeableUrls : The Class-Path manifest attribute in /usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/jaxb-runtime-2.3.1.jar referenced one or more files that do not exist: file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/jaxb-api-2.3.1.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/txw2-2.3.1.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/istack-commons-runtime-3.0.7.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/stax-ex-1.8.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/FastInfoset-1.2.15.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/javax.activation-api-1.2.0.jar +2025-04-17 10:54:29.632 INFO 9244 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : Devtools property defaults active! Set 'spring.devtools.add-properties' to 'false' to disable +2025-04-17 10:54:29.632 INFO 9244 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : For additional web related logging consider setting the 'logging.level.web' property to 'DEBUG' +2025-04-17 10:54:29.850 INFO 9244 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Multiple Spring Data modules found, entering strict repository configuration mode! +2025-04-17 10:54:29.851 INFO 9244 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data Redis repositories in DEFAULT mode. +2025-04-17 10:54:29.863 INFO 9244 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 7ms. Found 0 Redis repository interfaces. +2025-04-17 10:54:30.116 INFO 9244 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 9092 (http) +2025-04-17 10:54:30.119 INFO 9244 --- [restartedMain] o.apache.catalina.core.StandardService : Starting service [Tomcat] +2025-04-17 10:54:30.119 INFO 9244 --- [restartedMain] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.34] +2025-04-17 10:54:30.144 INFO 9244 --- [restartedMain] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext +2025-04-17 10:54:30.145 INFO 9244 --- [restartedMain] o.s.web.context.ContextLoader : Root WebApplicationContext: initialization completed in 513 ms +2025-04-17 10:54:30.708 INFO 9244 --- [restartedMain] n.b.p.u.AbstractUserAgentAnalyzerDirect : - Loaded 90 files in 231 msec using expression: classpath*:UserAgents/**/*.yaml +2025-04-17 10:54:30.708 INFO 9244 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : +2025-04-17 10:54:30.708 INFO 9244 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : /-----------------------------------------------------------\ +2025-04-17 10:54:30.708 INFO 9244 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : | Yauaa 5.20 (v5.20 @ 2020-11-22T15:39:16Z) | +2025-04-17 10:54:30.708 INFO 9244 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : +-----------------------------------------------------------+ +2025-04-17 10:54:30.708 INFO 9244 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : | For more information: https://yauaa.basjes.nl | +2025-04-17 10:54:30.708 INFO 9244 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : | Copyright (C) 2013-2020 Niels Basjes - License Apache 2.0 | +2025-04-17 10:54:30.708 INFO 9244 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : \-----------------------------------------------------------/ +2025-04-17 10:54:30.708 INFO 9244 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : +2025-04-17 10:54:30.713 INFO 9244 --- [restartedMain] n.b.p.u.AbstractUserAgentAnalyzerDirect : Building all needed matchers for the requested 11 fields. +2025-04-17 10:54:30.772 INFO 9244 --- [restartedMain] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor' +2025-04-17 10:54:30.863 INFO 9244 --- [restartedMain] org.quartz.impl.StdSchedulerFactory : Using default implementation for ThreadExecutor +2025-04-17 10:54:30.868 INFO 9244 --- [restartedMain] org.quartz.core.SchedulerSignalerImpl : Initialized Scheduler Signaller of type: class org.quartz.core.SchedulerSignalerImpl +2025-04-17 10:54:30.868 INFO 9244 --- [restartedMain] org.quartz.core.QuartzScheduler : Quartz Scheduler v.2.3.2 created. +2025-04-17 10:54:30.868 INFO 9244 --- [restartedMain] org.quartz.simpl.RAMJobStore : RAMJobStore initialized. +2025-04-17 10:54:30.868 INFO 9244 --- [restartedMain] org.quartz.core.QuartzScheduler : Scheduler meta-data: Quartz Scheduler (v2.3.2) 'quartzScheduler' with instanceId 'NON_CLUSTERED' + Scheduler class: 'org.quartz.core.QuartzScheduler' - running locally. + NOT STARTED. + Currently in standby mode. + Number of jobs executed: 0 + Using thread pool 'org.quartz.simpl.SimpleThreadPool' - with 10 threads. + Using job-store 'org.quartz.simpl.RAMJobStore' - which does not support persistence. and is not clustered. + +2025-04-17 10:54:30.868 INFO 9244 --- [restartedMain] org.quartz.impl.StdSchedulerFactory : Quartz scheduler 'quartzScheduler' initialized from an externally provided properties instance. +2025-04-17 10:54:30.868 INFO 9244 --- [restartedMain] org.quartz.impl.StdSchedulerFactory : Quartz scheduler version: 2.3.2 +2025-04-17 10:54:30.868 INFO 9244 --- [restartedMain] org.quartz.core.QuartzScheduler : JobFactory set to: org.springframework.scheduling.quartz.SpringBeanJobFactory@6e865ce8 +2025-04-17 10:54:30.903 INFO 9244 --- [restartedMain] o.s.s.web.DefaultSecurityFilterChain : Creating filter chain: any request, [org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter@6dfbd856, org.springframework.security.web.context.SecurityContextPersistenceFilter@21078975, org.springframework.security.web.header.HeaderWriterFilter@5b0f0111, org.springframework.web.filter.CorsFilter@82f5b50, org.springframework.security.web.authentication.logout.LogoutFilter@31c74a62, com.mingchen.common.config.JwtLoginFilter@af33bd8, com.mingchen.common.config.JwtFilter@24b4c49d, org.springframework.security.web.savedrequest.RequestCacheAwareFilter@651fc69f, org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter@12e2ae17, org.springframework.security.web.authentication.AnonymousAuthenticationFilter@17be9135, org.springframework.security.web.session.SessionManagementFilter@19d8444, org.springframework.security.web.access.ExceptionTranslationFilter@3da51340, org.springframework.security.web.access.intercept.FilterSecurityInterceptor@78235b2d] +2025-04-17 10:54:30.915 INFO 9244 --- [restartedMain] o.s.b.d.a.OptionalLiveReloadServer : LiveReload server is running on port 35729 +2025-04-17 10:54:30.926 INFO 9244 --- [restartedMain] o.s.s.quartz.SchedulerFactoryBean : Starting Quartz Scheduler now +2025-04-17 10:54:30.926 INFO 9244 --- [restartedMain] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED started. +2025-04-17 10:54:30.936 INFO 9244 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 9092 (http) with context path '' +2025-04-17 10:54:30.938 INFO 9244 --- [restartedMain] com.mingchen.BlogApiApplication : Started BlogApiApplication in 1.47 seconds (JVM running for 1.718) +2025-04-17 10:54:40.002 INFO 9244 --- [http-nio-9092-exec-2] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet' +2025-04-17 10:54:40.003 INFO 9244 --- [http-nio-9092-exec-2] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet' +2025-04-17 10:54:40.006 INFO 9244 --- [http-nio-9092-exec-2] o.s.web.servlet.DispatcherServlet : Completed initialization in 3 ms +2025-04-17 10:54:42.999 INFO 9244 --- [http-nio-9092-exec-2] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting... +2025-04-17 10:54:43.870 INFO 9244 --- [http-nio-9092-exec-2] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed. +2025-04-17 10:54:43.907 DEBUG 9244 --- [http-nio-9092-exec-2] c.m.m.L.selectList_mpCount : ==> Preparing: SELECT COUNT() FROM learningResources +2025-04-17 10:54:44.028 DEBUG 9244 --- [http-nio-9092-exec-2] c.m.m.L.selectList_mpCount : ==> Parameters: +2025-04-17 10:54:45.568 ERROR 9244 --- [http-nio-9092-exec-2] c.m.c.h.ControllerExceptionHandler : Request URL : http://localhost:9092/admin/learningResources/page, Exception : + +org.springframework.jdbc.BadSqlGrammarException: +### Error querying database. Cause: java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') FROM learningResources' at line 1 +### The error may exist in com/mingchen/mapper/LearningResourcesMapper.java (best guess) +### The error may involve defaultParameterMap +### The error occurred while setting parameters +### SQL: SELECT COUNT() FROM learningResources +### Cause: java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') FROM learningResources' at line 1 +; bad SQL grammar []; nested exception is java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') FROM learningResources' at line 1 + at org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.doTranslate(SQLErrorCodeSQLExceptionTranslator.java:235) + at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:72) + at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:91) + at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:441) + at jdk.proxy2/jdk.proxy2.$Proxy85.selectList(Unknown Source) + at org.mybatis.spring.SqlSessionTemplate.selectList(SqlSessionTemplate.java:224) + at com.baomidou.mybatisplus.core.override.MybatisMapperMethod.executeForMany(MybatisMapperMethod.java:164) + at com.baomidou.mybatisplus.core.override.MybatisMapperMethod.execute(MybatisMapperMethod.java:77) + at com.baomidou.mybatisplus.core.override.MybatisMapperProxy$PlainMethodInvoker.invoke(MybatisMapperProxy.java:152) + at com.baomidou.mybatisplus.core.override.MybatisMapperProxy.invoke(MybatisMapperProxy.java:89) + at jdk.proxy3/jdk.proxy3.$Proxy88.selectList(Unknown Source) + at com.baomidou.mybatisplus.core.mapper.BaseMapper.selectPage(BaseMapper.java:348) + at java.base/java.lang.invoke.MethodHandle.invokeWithArguments(MethodHandle.java:732) + at com.baomidou.mybatisplus.core.override.MybatisMapperProxy$DefaultMethodInvoker.invoke(MybatisMapperProxy.java:166) + at com.baomidou.mybatisplus.core.override.MybatisMapperProxy.invoke(MybatisMapperProxy.java:89) + at jdk.proxy3/jdk.proxy3.$Proxy88.selectPage(Unknown Source) + at com.mingchen.service.impl.LearningResourcesServiceImpl.getLearningResources(LearningResourcesServiceImpl.java:36) + at com.mingchen.service.impl.LearningResourcesServiceImpl$$FastClassBySpringCGLIB$$d7671a85.invoke() + at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) + at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:687) + at com.mingchen.service.impl.LearningResourcesServiceImpl$$EnhancerBySpringCGLIB$$389853a1.getLearningResources() + at com.mingchen.api.open.LearningResourcesController.getLearningResources(LearningResourcesController.java:31) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:569) + at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:190) + at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:138) + at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:105) + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:879) + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:793) + at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) + at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1040) + at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943) + at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) + at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898) + at javax.servlet.http.HttpServlet.service(HttpServlet.java:503) + at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) + at javax.servlet.http.HttpServlet.service(HttpServlet.java:590) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:320) + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:126) + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:90) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:118) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:137) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:111) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:158) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at com.mingchen.common.config.JwtFilter.doFilter(JwtFilter.java:68) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:200) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:116) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:92) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:92) + at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:77) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:105) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:56) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:215) + at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:178) + at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:358) + at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:271) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202) + at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) + at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541) + at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139) + at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) + at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) + at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) + at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:373) + at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) + at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868) + at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1590) + at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) + at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) + at java.base/java.lang.Thread.run(Thread.java:840) +Caused by: java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') FROM learningResources' at line 1 + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:120) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:97) + at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122) + at com.mysql.cj.jdbc.ClientPreparedStatement.executeInternal(ClientPreparedStatement.java:953) + at com.mysql.cj.jdbc.ClientPreparedStatement.execute(ClientPreparedStatement.java:370) + at com.zaxxer.hikari.pool.ProxyPreparedStatement.execute(ProxyPreparedStatement.java:44) + at com.zaxxer.hikari.pool.HikariProxyPreparedStatement.execute(HikariProxyPreparedStatement.java) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:569) + at org.apache.ibatis.logging.jdbc.PreparedStatementLogger.invoke(PreparedStatementLogger.java:58) + at jdk.proxy4/jdk.proxy4.$Proxy115.execute(Unknown Source) + at org.apache.ibatis.executor.statement.PreparedStatementHandler.query(PreparedStatementHandler.java:65) + at org.apache.ibatis.executor.statement.RoutingStatementHandler.query(RoutingStatementHandler.java:80) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:569) + at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:61) + at jdk.proxy2/jdk.proxy2.$Proxy113.query(Unknown Source) + at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:65) + at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:336) + at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:158) + at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:110) + at com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor.willDoQuery(PaginationInnerInterceptor.java:141) + at com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor.intercept(MybatisPlusInterceptor.java:75) + at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:59) + at jdk.proxy2/jdk.proxy2.$Proxy112.query(Unknown Source) + at com.github.pagehelper.PageInterceptor.intercept(PageInterceptor.java:108) + at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:59) + at jdk.proxy2/jdk.proxy2.$Proxy112.query(Unknown Source) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:154) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:147) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:142) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:569) + at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:427) + ... 106 common frames omitted + +2025-04-17 10:54:45.595 WARN 9244 --- [http-nio-9092-exec-2] .m.m.a.ExceptionHandlerExceptionResolver : Resolved [org.springframework.jdbc.BadSqlGrammarException: +### Error querying database. Cause: java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') FROM learningResources' at line 1 +### The error may exist in com/mingchen/mapper/LearningResourcesMapper.java (best guess) +### The error may involve defaultParameterMap +### The error occurred while setting parameters +### SQL: SELECT COUNT() FROM learningResources +### Cause: java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') FROM learningResources' at line 1 +; bad SQL grammar []; nested exception is java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') FROM learningResources' at line 1] +2025-04-17 10:55:14.038 INFO 9244 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED paused. +2025-04-17 10:55:14.040 INFO 9244 --- [SpringContextShutdownHook] o.s.s.quartz.SchedulerFactoryBean : Shutting down Quartz Scheduler +2025-04-17 10:55:14.040 INFO 9244 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED shutting down. +2025-04-17 10:55:14.040 INFO 9244 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED paused. +2025-04-17 10:55:14.040 INFO 9244 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED shutdown complete. +2025-04-17 10:55:14.040 INFO 9244 --- [SpringContextShutdownHook] o.s.s.concurrent.ThreadPoolTaskExecutor : Shutting down ExecutorService 'applicationTaskExecutor' +2025-04-17 10:55:14.047 INFO 9244 --- [SpringContextShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown initiated... +2025-04-17 10:55:14.050 INFO 9244 --- [SpringContextShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown completed. +2025-04-17 10:55:16.955 INFO 9286 --- [restartedMain] com.mingchen.BlogApiApplication : Starting BlogApiApplication on mingchendeMac-mini.local with PID 9286 (/Users/mingchen/code/java/other/legalAid/api/target/classes started by mingchen in /Users/mingchen/code/java/other/legalAid) +2025-04-17 10:55:16.956 DEBUG 9286 --- [restartedMain] com.mingchen.BlogApiApplication : Running with Spring Boot v2.2.7.RELEASE, Spring v5.2.6.RELEASE +2025-04-17 10:55:16.956 INFO 9286 --- [restartedMain] com.mingchen.BlogApiApplication : The following profiles are active: dev +2025-04-17 10:55:16.972 INFO 9286 --- [restartedMain] o.s.b.devtools.restart.ChangeableUrls : The Class-Path manifest attribute in /usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/jaxb-runtime-2.3.1.jar referenced one or more files that do not exist: file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/jaxb-api-2.3.1.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/txw2-2.3.1.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/istack-commons-runtime-3.0.7.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/stax-ex-1.8.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/FastInfoset-1.2.15.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/javax.activation-api-1.2.0.jar +2025-04-17 10:55:16.972 INFO 9286 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : Devtools property defaults active! Set 'spring.devtools.add-properties' to 'false' to disable +2025-04-17 10:55:16.973 INFO 9286 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : For additional web related logging consider setting the 'logging.level.web' property to 'DEBUG' +2025-04-17 10:55:17.174 INFO 9286 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Multiple Spring Data modules found, entering strict repository configuration mode! +2025-04-17 10:55:17.175 INFO 9286 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data Redis repositories in DEFAULT mode. +2025-04-17 10:55:17.187 INFO 9286 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 7ms. Found 0 Redis repository interfaces. +2025-04-17 10:55:17.428 INFO 9286 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 9092 (http) +2025-04-17 10:55:17.431 INFO 9286 --- [restartedMain] o.apache.catalina.core.StandardService : Starting service [Tomcat] +2025-04-17 10:55:17.431 INFO 9286 --- [restartedMain] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.34] +2025-04-17 10:55:17.453 INFO 9286 --- [restartedMain] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext +2025-04-17 10:55:17.453 INFO 9286 --- [restartedMain] o.s.web.context.ContextLoader : Root WebApplicationContext: initialization completed in 480 ms +2025-04-17 10:55:17.943 INFO 9286 --- [restartedMain] n.b.p.u.AbstractUserAgentAnalyzerDirect : - Loaded 90 files in 207 msec using expression: classpath*:UserAgents/**/*.yaml +2025-04-17 10:55:17.943 INFO 9286 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : +2025-04-17 10:55:17.943 INFO 9286 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : /-----------------------------------------------------------\ +2025-04-17 10:55:17.943 INFO 9286 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : | Yauaa 5.20 (v5.20 @ 2020-11-22T15:39:16Z) | +2025-04-17 10:55:17.943 INFO 9286 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : +-----------------------------------------------------------+ +2025-04-17 10:55:17.943 INFO 9286 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : | For more information: https://yauaa.basjes.nl | +2025-04-17 10:55:17.943 INFO 9286 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : | Copyright (C) 2013-2020 Niels Basjes - License Apache 2.0 | +2025-04-17 10:55:17.943 INFO 9286 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : \-----------------------------------------------------------/ +2025-04-17 10:55:17.943 INFO 9286 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : +2025-04-17 10:55:17.948 INFO 9286 --- [restartedMain] n.b.p.u.AbstractUserAgentAnalyzerDirect : Building all needed matchers for the requested 11 fields. +2025-04-17 10:55:18.003 INFO 9286 --- [restartedMain] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor' +2025-04-17 10:55:18.087 INFO 9286 --- [restartedMain] org.quartz.impl.StdSchedulerFactory : Using default implementation for ThreadExecutor +2025-04-17 10:55:18.091 INFO 9286 --- [restartedMain] org.quartz.core.SchedulerSignalerImpl : Initialized Scheduler Signaller of type: class org.quartz.core.SchedulerSignalerImpl +2025-04-17 10:55:18.091 INFO 9286 --- [restartedMain] org.quartz.core.QuartzScheduler : Quartz Scheduler v.2.3.2 created. +2025-04-17 10:55:18.091 INFO 9286 --- [restartedMain] org.quartz.simpl.RAMJobStore : RAMJobStore initialized. +2025-04-17 10:55:18.091 INFO 9286 --- [restartedMain] org.quartz.core.QuartzScheduler : Scheduler meta-data: Quartz Scheduler (v2.3.2) 'quartzScheduler' with instanceId 'NON_CLUSTERED' + Scheduler class: 'org.quartz.core.QuartzScheduler' - running locally. + NOT STARTED. + Currently in standby mode. + Number of jobs executed: 0 + Using thread pool 'org.quartz.simpl.SimpleThreadPool' - with 10 threads. + Using job-store 'org.quartz.simpl.RAMJobStore' - which does not support persistence. and is not clustered. + +2025-04-17 10:55:18.091 INFO 9286 --- [restartedMain] org.quartz.impl.StdSchedulerFactory : Quartz scheduler 'quartzScheduler' initialized from an externally provided properties instance. +2025-04-17 10:55:18.091 INFO 9286 --- [restartedMain] org.quartz.impl.StdSchedulerFactory : Quartz scheduler version: 2.3.2 +2025-04-17 10:55:18.091 INFO 9286 --- [restartedMain] org.quartz.core.QuartzScheduler : JobFactory set to: org.springframework.scheduling.quartz.SpringBeanJobFactory@355d1451 +2025-04-17 10:55:18.122 INFO 9286 --- [restartedMain] o.s.s.web.DefaultSecurityFilterChain : Creating filter chain: any request, [org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter@2bb2bc65, org.springframework.security.web.context.SecurityContextPersistenceFilter@5ae78d71, org.springframework.security.web.header.HeaderWriterFilter@5bd2c45d, org.springframework.web.filter.CorsFilter@5d126c7b, org.springframework.security.web.authentication.logout.LogoutFilter@2f97579b, com.mingchen.common.config.JwtLoginFilter@7555a33b, com.mingchen.common.config.JwtFilter@20066f7, org.springframework.security.web.savedrequest.RequestCacheAwareFilter@39efabe9, org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter@7b464637, org.springframework.security.web.authentication.AnonymousAuthenticationFilter@3cefb346, org.springframework.security.web.session.SessionManagementFilter@2ca07988, org.springframework.security.web.access.ExceptionTranslationFilter@698ca1b9, org.springframework.security.web.access.intercept.FilterSecurityInterceptor@14cfb9e3] +2025-04-17 10:55:18.132 INFO 9286 --- [restartedMain] o.s.b.d.a.OptionalLiveReloadServer : LiveReload server is running on port 35729 +2025-04-17 10:55:18.141 INFO 9286 --- [restartedMain] o.s.s.quartz.SchedulerFactoryBean : Starting Quartz Scheduler now +2025-04-17 10:55:18.141 INFO 9286 --- [restartedMain] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED started. +2025-04-17 10:55:18.150 INFO 9286 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 9092 (http) with context path '' +2025-04-17 10:55:18.152 INFO 9286 --- [restartedMain] com.mingchen.BlogApiApplication : Started BlogApiApplication in 1.343 seconds (JVM running for 1.596) +2025-04-17 10:55:25.613 INFO 9286 --- [http-nio-9092-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet' +2025-04-17 10:55:25.613 INFO 9286 --- [http-nio-9092-exec-1] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet' +2025-04-17 10:55:25.614 INFO 9286 --- [http-nio-9092-exec-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 1 ms +2025-04-17 10:55:27.435 INFO 9286 --- [http-nio-9092-exec-1] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting... +2025-04-17 10:55:28.310 INFO 9286 --- [http-nio-9092-exec-1] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed. +2025-04-17 10:55:28.346 DEBUG 9286 --- [http-nio-9092-exec-1] c.m.m.L.selectList_mpCount : ==> Preparing: SELECT COUNT() FROM learning_resources +2025-04-17 10:55:28.466 DEBUG 9286 --- [http-nio-9092-exec-1] c.m.m.L.selectList_mpCount : ==> Parameters: +2025-04-17 10:55:29.983 ERROR 9286 --- [http-nio-9092-exec-1] c.m.c.h.ControllerExceptionHandler : Request URL : http://localhost:9092/admin/learningResources/page, Exception : + +org.springframework.jdbc.BadSqlGrammarException: +### Error querying database. Cause: java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') FROM learning_resources' at line 1 +### The error may exist in com/mingchen/mapper/LearningResourcesMapper.java (best guess) +### The error may involve defaultParameterMap +### The error occurred while setting parameters +### SQL: SELECT COUNT() FROM learning_resources +### Cause: java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') FROM learning_resources' at line 1 +; bad SQL grammar []; nested exception is java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') FROM learning_resources' at line 1 + at org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.doTranslate(SQLErrorCodeSQLExceptionTranslator.java:235) + at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:72) + at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:91) + at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:441) + at jdk.proxy2/jdk.proxy2.$Proxy85.selectList(Unknown Source) + at org.mybatis.spring.SqlSessionTemplate.selectList(SqlSessionTemplate.java:224) + at com.baomidou.mybatisplus.core.override.MybatisMapperMethod.executeForMany(MybatisMapperMethod.java:164) + at com.baomidou.mybatisplus.core.override.MybatisMapperMethod.execute(MybatisMapperMethod.java:77) + at com.baomidou.mybatisplus.core.override.MybatisMapperProxy$PlainMethodInvoker.invoke(MybatisMapperProxy.java:152) + at com.baomidou.mybatisplus.core.override.MybatisMapperProxy.invoke(MybatisMapperProxy.java:89) + at jdk.proxy3/jdk.proxy3.$Proxy88.selectList(Unknown Source) + at com.baomidou.mybatisplus.core.mapper.BaseMapper.selectPage(BaseMapper.java:348) + at java.base/java.lang.invoke.MethodHandle.invokeWithArguments(MethodHandle.java:732) + at com.baomidou.mybatisplus.core.override.MybatisMapperProxy$DefaultMethodInvoker.invoke(MybatisMapperProxy.java:166) + at com.baomidou.mybatisplus.core.override.MybatisMapperProxy.invoke(MybatisMapperProxy.java:89) + at jdk.proxy3/jdk.proxy3.$Proxy88.selectPage(Unknown Source) + at com.mingchen.service.impl.LearningResourcesServiceImpl.getLearningResources(LearningResourcesServiceImpl.java:36) + at com.mingchen.service.impl.LearningResourcesServiceImpl$$FastClassBySpringCGLIB$$d7671a85.invoke() + at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) + at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:687) + at com.mingchen.service.impl.LearningResourcesServiceImpl$$EnhancerBySpringCGLIB$$7af28198.getLearningResources() + at com.mingchen.api.open.LearningResourcesController.getLearningResources(LearningResourcesController.java:31) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:569) + at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:190) + at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:138) + at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:105) + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:879) + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:793) + at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) + at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1040) + at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943) + at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) + at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898) + at javax.servlet.http.HttpServlet.service(HttpServlet.java:503) + at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) + at javax.servlet.http.HttpServlet.service(HttpServlet.java:590) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:320) + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:126) + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:90) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:118) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:137) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:111) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:158) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at com.mingchen.common.config.JwtFilter.doFilter(JwtFilter.java:68) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:200) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:116) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:92) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:92) + at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:77) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:105) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:56) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:215) + at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:178) + at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:358) + at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:271) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202) + at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) + at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541) + at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139) + at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) + at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) + at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) + at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:373) + at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) + at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868) + at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1590) + at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) + at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) + at java.base/java.lang.Thread.run(Thread.java:840) +Caused by: java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') FROM learning_resources' at line 1 + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:120) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:97) + at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122) + at com.mysql.cj.jdbc.ClientPreparedStatement.executeInternal(ClientPreparedStatement.java:953) + at com.mysql.cj.jdbc.ClientPreparedStatement.execute(ClientPreparedStatement.java:370) + at com.zaxxer.hikari.pool.ProxyPreparedStatement.execute(ProxyPreparedStatement.java:44) + at com.zaxxer.hikari.pool.HikariProxyPreparedStatement.execute(HikariProxyPreparedStatement.java) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:569) + at org.apache.ibatis.logging.jdbc.PreparedStatementLogger.invoke(PreparedStatementLogger.java:58) + at jdk.proxy4/jdk.proxy4.$Proxy115.execute(Unknown Source) + at org.apache.ibatis.executor.statement.PreparedStatementHandler.query(PreparedStatementHandler.java:65) + at org.apache.ibatis.executor.statement.RoutingStatementHandler.query(RoutingStatementHandler.java:80) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:569) + at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:61) + at jdk.proxy2/jdk.proxy2.$Proxy113.query(Unknown Source) + at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:65) + at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:336) + at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:158) + at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:110) + at com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor.willDoQuery(PaginationInnerInterceptor.java:141) + at com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor.intercept(MybatisPlusInterceptor.java:75) + at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:59) + at jdk.proxy2/jdk.proxy2.$Proxy112.query(Unknown Source) + at com.github.pagehelper.PageInterceptor.intercept(PageInterceptor.java:108) + at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:59) + at jdk.proxy2/jdk.proxy2.$Proxy112.query(Unknown Source) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:154) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:147) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:142) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:569) + at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:427) + ... 106 common frames omitted + +2025-04-17 10:55:30.009 WARN 9286 --- [http-nio-9092-exec-1] .m.m.a.ExceptionHandlerExceptionResolver : Resolved [org.springframework.jdbc.BadSqlGrammarException: +### Error querying database. Cause: java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') FROM learning_resources' at line 1 +### The error may exist in com/mingchen/mapper/LearningResourcesMapper.java (best guess) +### The error may involve defaultParameterMap +### The error occurred while setting parameters +### SQL: SELECT COUNT() FROM learning_resources +### Cause: java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') FROM learning_resources' at line 1 +; bad SQL grammar []; nested exception is java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') FROM learning_resources' at line 1] +2025-04-17 10:57:38.777 INFO 9286 --- [Thread-5] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED paused. +2025-04-17 10:57:38.778 INFO 9286 --- [Thread-5] o.s.s.quartz.SchedulerFactoryBean : Shutting down Quartz Scheduler +2025-04-17 10:57:38.778 INFO 9286 --- [Thread-5] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED shutting down. +2025-04-17 10:57:38.778 INFO 9286 --- [Thread-5] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED paused. +2025-04-17 10:57:38.778 INFO 9286 --- [Thread-5] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED shutdown complete. +2025-04-17 10:57:38.779 INFO 9286 --- [Thread-5] o.s.s.concurrent.ThreadPoolTaskExecutor : Shutting down ExecutorService 'applicationTaskExecutor' +2025-04-17 10:57:38.785 INFO 9286 --- [Thread-5] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown initiated... +2025-04-17 10:57:38.790 INFO 9286 --- [Thread-5] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown completed. +2025-04-17 10:57:42.736 INFO 9435 --- [restartedMain] com.mingchen.BlogApiApplication : Starting BlogApiApplication on mingchendeMac-mini.local with PID 9435 (/Users/mingchen/code/java/other/legalAid/api/target/classes started by mingchen in /Users/mingchen/code/java/other/legalAid) +2025-04-17 10:57:42.737 DEBUG 9435 --- [restartedMain] com.mingchen.BlogApiApplication : Running with Spring Boot v2.2.7.RELEASE, Spring v5.2.6.RELEASE +2025-04-17 10:57:42.737 INFO 9435 --- [restartedMain] com.mingchen.BlogApiApplication : The following profiles are active: dev +2025-04-17 10:57:42.753 INFO 9435 --- [restartedMain] o.s.b.devtools.restart.ChangeableUrls : The Class-Path manifest attribute in /usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/jaxb-runtime-2.3.1.jar referenced one or more files that do not exist: file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/jaxb-api-2.3.1.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/txw2-2.3.1.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/istack-commons-runtime-3.0.7.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/stax-ex-1.8.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/FastInfoset-1.2.15.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/javax.activation-api-1.2.0.jar +2025-04-17 10:57:42.753 INFO 9435 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : Devtools property defaults active! Set 'spring.devtools.add-properties' to 'false' to disable +2025-04-17 10:57:42.753 INFO 9435 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : For additional web related logging consider setting the 'logging.level.web' property to 'DEBUG' +2025-04-17 10:57:42.938 INFO 9435 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Multiple Spring Data modules found, entering strict repository configuration mode! +2025-04-17 10:57:42.939 INFO 9435 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data Redis repositories in DEFAULT mode. +2025-04-17 10:57:42.949 INFO 9435 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 6ms. Found 0 Redis repository interfaces. +2025-04-17 10:57:43.183 INFO 9435 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 9092 (http) +2025-04-17 10:57:43.186 INFO 9435 --- [restartedMain] o.apache.catalina.core.StandardService : Starting service [Tomcat] +2025-04-17 10:57:43.187 INFO 9435 --- [restartedMain] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.34] +2025-04-17 10:57:43.211 INFO 9435 --- [restartedMain] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext +2025-04-17 10:57:43.211 INFO 9435 --- [restartedMain] o.s.web.context.ContextLoader : Root WebApplicationContext: initialization completed in 458 ms +2025-04-17 10:57:43.702 INFO 9435 --- [restartedMain] n.b.p.u.AbstractUserAgentAnalyzerDirect : - Loaded 90 files in 207 msec using expression: classpath*:UserAgents/**/*.yaml +2025-04-17 10:57:43.702 INFO 9435 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : +2025-04-17 10:57:43.702 INFO 9435 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : /-----------------------------------------------------------\ +2025-04-17 10:57:43.702 INFO 9435 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : | Yauaa 5.20 (v5.20 @ 2020-11-22T15:39:16Z) | +2025-04-17 10:57:43.702 INFO 9435 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : +-----------------------------------------------------------+ +2025-04-17 10:57:43.702 INFO 9435 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : | For more information: https://yauaa.basjes.nl | +2025-04-17 10:57:43.702 INFO 9435 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : | Copyright (C) 2013-2020 Niels Basjes - License Apache 2.0 | +2025-04-17 10:57:43.702 INFO 9435 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : \-----------------------------------------------------------/ +2025-04-17 10:57:43.702 INFO 9435 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : +2025-04-17 10:57:43.705 INFO 9435 --- [restartedMain] n.b.p.u.AbstractUserAgentAnalyzerDirect : Building all needed matchers for the requested 11 fields. +2025-04-17 10:57:43.755 INFO 9435 --- [restartedMain] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor' +2025-04-17 10:57:43.828 INFO 9435 --- [restartedMain] org.quartz.impl.StdSchedulerFactory : Using default implementation for ThreadExecutor +2025-04-17 10:57:43.832 INFO 9435 --- [restartedMain] org.quartz.core.SchedulerSignalerImpl : Initialized Scheduler Signaller of type: class org.quartz.core.SchedulerSignalerImpl +2025-04-17 10:57:43.832 INFO 9435 --- [restartedMain] org.quartz.core.QuartzScheduler : Quartz Scheduler v.2.3.2 created. +2025-04-17 10:57:43.832 INFO 9435 --- [restartedMain] org.quartz.simpl.RAMJobStore : RAMJobStore initialized. +2025-04-17 10:57:43.832 INFO 9435 --- [restartedMain] org.quartz.core.QuartzScheduler : Scheduler meta-data: Quartz Scheduler (v2.3.2) 'quartzScheduler' with instanceId 'NON_CLUSTERED' + Scheduler class: 'org.quartz.core.QuartzScheduler' - running locally. + NOT STARTED. + Currently in standby mode. + Number of jobs executed: 0 + Using thread pool 'org.quartz.simpl.SimpleThreadPool' - with 10 threads. + Using job-store 'org.quartz.simpl.RAMJobStore' - which does not support persistence. and is not clustered. + +2025-04-17 10:57:43.832 INFO 9435 --- [restartedMain] org.quartz.impl.StdSchedulerFactory : Quartz scheduler 'quartzScheduler' initialized from an externally provided properties instance. +2025-04-17 10:57:43.832 INFO 9435 --- [restartedMain] org.quartz.impl.StdSchedulerFactory : Quartz scheduler version: 2.3.2 +2025-04-17 10:57:43.832 INFO 9435 --- [restartedMain] org.quartz.core.QuartzScheduler : JobFactory set to: org.springframework.scheduling.quartz.SpringBeanJobFactory@638c8fe6 +2025-04-17 10:57:43.860 INFO 9435 --- [restartedMain] o.s.s.web.DefaultSecurityFilterChain : Creating filter chain: any request, [org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter@3fd820b, org.springframework.security.web.context.SecurityContextPersistenceFilter@2f3448fd, org.springframework.security.web.header.HeaderWriterFilter@3f64812b, org.springframework.web.filter.CorsFilter@7fb90ce5, org.springframework.security.web.authentication.logout.LogoutFilter@65bf89b3, com.mingchen.common.config.JwtLoginFilter@3e98635a, com.mingchen.common.config.JwtFilter@2ba6eb8b, org.springframework.security.web.savedrequest.RequestCacheAwareFilter@233cfaa9, org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter@6dc023c2, org.springframework.security.web.authentication.AnonymousAuthenticationFilter@44a4c92e, org.springframework.security.web.session.SessionManagementFilter@37e37186, org.springframework.security.web.access.ExceptionTranslationFilter@629a0fe6, org.springframework.security.web.access.intercept.FilterSecurityInterceptor@285bebc] +2025-04-17 10:57:43.870 INFO 9435 --- [restartedMain] o.s.b.d.a.OptionalLiveReloadServer : LiveReload server is running on port 35729 +2025-04-17 10:57:43.879 INFO 9435 --- [restartedMain] o.s.s.quartz.SchedulerFactoryBean : Starting Quartz Scheduler now +2025-04-17 10:57:43.879 INFO 9435 --- [restartedMain] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED started. +2025-04-17 10:57:43.887 INFO 9435 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 9092 (http) with context path '' +2025-04-17 10:57:43.889 INFO 9435 --- [restartedMain] com.mingchen.BlogApiApplication : Started BlogApiApplication in 1.464 seconds (JVM running for 1.767) +2025-04-17 10:57:53.943 INFO 9435 --- [http-nio-9092-exec-2] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet' +2025-04-17 10:57:53.944 INFO 9435 --- [http-nio-9092-exec-2] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet' +2025-04-17 10:57:53.946 INFO 9435 --- [http-nio-9092-exec-2] o.s.web.servlet.DispatcherServlet : Completed initialization in 2 ms +2025-04-17 10:57:55.624 INFO 9435 --- [http-nio-9092-exec-2] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting... +2025-04-17 10:57:56.442 INFO 9435 --- [http-nio-9092-exec-2] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed. +2025-04-17 10:57:56.480 DEBUG 9435 --- [http-nio-9092-exec-2] c.m.m.L.selectList_mpCount : ==> Preparing: SELECT COUNT() FROM learning_resources +2025-04-17 10:57:56.595 DEBUG 9435 --- [http-nio-9092-exec-2] c.m.m.L.selectList_mpCount : ==> Parameters: +2025-04-17 10:57:58.185 ERROR 9435 --- [http-nio-9092-exec-2] c.m.c.h.ControllerExceptionHandler : Request URL : http://localhost:9092/admin/learningResources/page, Exception : + +org.springframework.jdbc.BadSqlGrammarException: +### Error querying database. Cause: java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') FROM learning_resources' at line 1 +### The error may exist in com/mingchen/mapper/LearningResourcesMapper.java (best guess) +### The error may involve defaultParameterMap +### The error occurred while setting parameters +### SQL: SELECT COUNT() FROM learning_resources +### Cause: java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') FROM learning_resources' at line 1 +; bad SQL grammar []; nested exception is java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') FROM learning_resources' at line 1 + at org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.doTranslate(SQLErrorCodeSQLExceptionTranslator.java:235) + at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:72) + at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:91) + at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:441) + at jdk.proxy2/jdk.proxy2.$Proxy85.selectList(Unknown Source) + at org.mybatis.spring.SqlSessionTemplate.selectList(SqlSessionTemplate.java:224) + at com.baomidou.mybatisplus.core.override.MybatisMapperMethod.executeForMany(MybatisMapperMethod.java:164) + at com.baomidou.mybatisplus.core.override.MybatisMapperMethod.execute(MybatisMapperMethod.java:77) + at com.baomidou.mybatisplus.core.override.MybatisMapperProxy$PlainMethodInvoker.invoke(MybatisMapperProxy.java:152) + at com.baomidou.mybatisplus.core.override.MybatisMapperProxy.invoke(MybatisMapperProxy.java:89) + at jdk.proxy3/jdk.proxy3.$Proxy88.selectList(Unknown Source) + at com.baomidou.mybatisplus.core.mapper.BaseMapper.selectPage(BaseMapper.java:348) + at java.base/java.lang.invoke.MethodHandle.invokeWithArguments(MethodHandle.java:732) + at com.baomidou.mybatisplus.core.override.MybatisMapperProxy$DefaultMethodInvoker.invoke(MybatisMapperProxy.java:166) + at com.baomidou.mybatisplus.core.override.MybatisMapperProxy.invoke(MybatisMapperProxy.java:89) + at jdk.proxy3/jdk.proxy3.$Proxy88.selectPage(Unknown Source) + at com.mingchen.service.impl.LearningResourcesServiceImpl.getLearningResources(LearningResourcesServiceImpl.java:36) + at com.mingchen.service.impl.LearningResourcesServiceImpl$$FastClassBySpringCGLIB$$d7671a85.invoke() + at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) + at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:687) + at com.mingchen.service.impl.LearningResourcesServiceImpl$$EnhancerBySpringCGLIB$$b93a8e0.getLearningResources() + at com.mingchen.api.open.LearningResourcesController.getLearningResources(LearningResourcesController.java:31) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:569) + at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:190) + at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:138) + at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:105) + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:879) + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:793) + at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) + at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1040) + at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943) + at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) + at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898) + at javax.servlet.http.HttpServlet.service(HttpServlet.java:503) + at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) + at javax.servlet.http.HttpServlet.service(HttpServlet.java:590) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:320) + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:126) + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:90) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:118) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:137) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:111) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:158) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at com.mingchen.common.config.JwtFilter.doFilter(JwtFilter.java:68) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:200) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:116) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:92) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:92) + at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:77) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:105) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:56) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:215) + at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:178) + at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:358) + at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:271) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202) + at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) + at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541) + at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139) + at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) + at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) + at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) + at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:373) + at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) + at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868) + at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1590) + at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) + at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) + at java.base/java.lang.Thread.run(Thread.java:840) +Caused by: java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') FROM learning_resources' at line 1 + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:120) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:97) + at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122) + at com.mysql.cj.jdbc.ClientPreparedStatement.executeInternal(ClientPreparedStatement.java:953) + at com.mysql.cj.jdbc.ClientPreparedStatement.execute(ClientPreparedStatement.java:370) + at com.zaxxer.hikari.pool.ProxyPreparedStatement.execute(ProxyPreparedStatement.java:44) + at com.zaxxer.hikari.pool.HikariProxyPreparedStatement.execute(HikariProxyPreparedStatement.java) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:569) + at org.apache.ibatis.logging.jdbc.PreparedStatementLogger.invoke(PreparedStatementLogger.java:58) + at jdk.proxy4/jdk.proxy4.$Proxy115.execute(Unknown Source) + at org.apache.ibatis.executor.statement.PreparedStatementHandler.query(PreparedStatementHandler.java:65) + at org.apache.ibatis.executor.statement.RoutingStatementHandler.query(RoutingStatementHandler.java:80) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:569) + at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:61) + at jdk.proxy2/jdk.proxy2.$Proxy113.query(Unknown Source) + at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:65) + at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:336) + at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:158) + at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:110) + at com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor.willDoQuery(PaginationInnerInterceptor.java:141) + at com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor.intercept(MybatisPlusInterceptor.java:75) + at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:59) + at jdk.proxy2/jdk.proxy2.$Proxy112.query(Unknown Source) + at com.github.pagehelper.PageInterceptor.intercept(PageInterceptor.java:108) + at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:59) + at jdk.proxy2/jdk.proxy2.$Proxy112.query(Unknown Source) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:154) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:147) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:142) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:569) + at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:427) + ... 106 common frames omitted + +2025-04-17 10:57:58.209 WARN 9435 --- [http-nio-9092-exec-2] .m.m.a.ExceptionHandlerExceptionResolver : Resolved [org.springframework.jdbc.BadSqlGrammarException: +### Error querying database. Cause: java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') FROM learning_resources' at line 1 +### The error may exist in com/mingchen/mapper/LearningResourcesMapper.java (best guess) +### The error may involve defaultParameterMap +### The error occurred while setting parameters +### SQL: SELECT COUNT() FROM learning_resources +### Cause: java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') FROM learning_resources' at line 1 +; bad SQL grammar []; nested exception is java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') FROM learning_resources' at line 1] +2025-04-17 11:04:27.000 INFO 9435 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED paused. +2025-04-17 11:04:27.002 INFO 9435 --- [SpringContextShutdownHook] o.s.s.quartz.SchedulerFactoryBean : Shutting down Quartz Scheduler +2025-04-17 11:04:27.002 INFO 9435 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED shutting down. +2025-04-17 11:04:27.002 INFO 9435 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED paused. +2025-04-17 11:04:27.002 INFO 9435 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED shutdown complete. +2025-04-17 11:04:27.003 INFO 9435 --- [SpringContextShutdownHook] o.s.s.concurrent.ThreadPoolTaskExecutor : Shutting down ExecutorService 'applicationTaskExecutor' +2025-04-17 11:04:27.010 INFO 9435 --- [SpringContextShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown initiated... +2025-04-17 11:04:27.012 INFO 9435 --- [SpringContextShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown completed. +2025-04-17 11:04:29.912 INFO 9791 --- [restartedMain] com.mingchen.BlogApiApplication : Starting BlogApiApplication on mingchendeMac-mini.local with PID 9791 (/Users/mingchen/code/java/other/legalAid/api/target/classes started by mingchen in /Users/mingchen/code/java/other/legalAid) +2025-04-17 11:04:29.914 DEBUG 9791 --- [restartedMain] com.mingchen.BlogApiApplication : Running with Spring Boot v2.2.7.RELEASE, Spring v5.2.6.RELEASE +2025-04-17 11:04:29.914 INFO 9791 --- [restartedMain] com.mingchen.BlogApiApplication : The following profiles are active: dev +2025-04-17 11:04:29.931 INFO 9791 --- [restartedMain] o.s.b.devtools.restart.ChangeableUrls : The Class-Path manifest attribute in /usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/jaxb-runtime-2.3.1.jar referenced one or more files that do not exist: file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/jaxb-api-2.3.1.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/txw2-2.3.1.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/istack-commons-runtime-3.0.7.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/stax-ex-1.8.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/FastInfoset-1.2.15.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/javax.activation-api-1.2.0.jar +2025-04-17 11:04:29.931 INFO 9791 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : Devtools property defaults active! Set 'spring.devtools.add-properties' to 'false' to disable +2025-04-17 11:04:29.931 INFO 9791 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : For additional web related logging consider setting the 'logging.level.web' property to 'DEBUG' +2025-04-17 11:04:30.159 INFO 9791 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Multiple Spring Data modules found, entering strict repository configuration mode! +2025-04-17 11:04:30.160 INFO 9791 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data Redis repositories in DEFAULT mode. +2025-04-17 11:04:30.171 INFO 9791 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 7ms. Found 0 Redis repository interfaces. +2025-04-17 11:04:30.421 INFO 9791 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 9092 (http) +2025-04-17 11:04:30.425 INFO 9791 --- [restartedMain] o.apache.catalina.core.StandardService : Starting service [Tomcat] +2025-04-17 11:04:30.425 INFO 9791 --- [restartedMain] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.34] +2025-04-17 11:04:30.447 INFO 9791 --- [restartedMain] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext +2025-04-17 11:04:30.447 INFO 9791 --- [restartedMain] o.s.web.context.ContextLoader : Root WebApplicationContext: initialization completed in 516 ms +2025-04-17 11:04:30.954 INFO 9791 --- [restartedMain] n.b.p.u.AbstractUserAgentAnalyzerDirect : - Loaded 90 files in 207 msec using expression: classpath*:UserAgents/**/*.yaml +2025-04-17 11:04:30.954 INFO 9791 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : +2025-04-17 11:04:30.954 INFO 9791 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : /-----------------------------------------------------------\ +2025-04-17 11:04:30.954 INFO 9791 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : | Yauaa 5.20 (v5.20 @ 2020-11-22T15:39:16Z) | +2025-04-17 11:04:30.954 INFO 9791 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : +-----------------------------------------------------------+ +2025-04-17 11:04:30.954 INFO 9791 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : | For more information: https://yauaa.basjes.nl | +2025-04-17 11:04:30.954 INFO 9791 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : | Copyright (C) 2013-2020 Niels Basjes - License Apache 2.0 | +2025-04-17 11:04:30.954 INFO 9791 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : \-----------------------------------------------------------/ +2025-04-17 11:04:30.954 INFO 9791 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : +2025-04-17 11:04:30.958 INFO 9791 --- [restartedMain] n.b.p.u.AbstractUserAgentAnalyzerDirect : Building all needed matchers for the requested 11 fields. +2025-04-17 11:04:31.010 INFO 9791 --- [restartedMain] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor' +2025-04-17 11:04:31.086 INFO 9791 --- [restartedMain] org.quartz.impl.StdSchedulerFactory : Using default implementation for ThreadExecutor +2025-04-17 11:04:31.090 INFO 9791 --- [restartedMain] org.quartz.core.SchedulerSignalerImpl : Initialized Scheduler Signaller of type: class org.quartz.core.SchedulerSignalerImpl +2025-04-17 11:04:31.090 INFO 9791 --- [restartedMain] org.quartz.core.QuartzScheduler : Quartz Scheduler v.2.3.2 created. +2025-04-17 11:04:31.090 INFO 9791 --- [restartedMain] org.quartz.simpl.RAMJobStore : RAMJobStore initialized. +2025-04-17 11:04:31.090 INFO 9791 --- [restartedMain] org.quartz.core.QuartzScheduler : Scheduler meta-data: Quartz Scheduler (v2.3.2) 'quartzScheduler' with instanceId 'NON_CLUSTERED' + Scheduler class: 'org.quartz.core.QuartzScheduler' - running locally. + NOT STARTED. + Currently in standby mode. + Number of jobs executed: 0 + Using thread pool 'org.quartz.simpl.SimpleThreadPool' - with 10 threads. + Using job-store 'org.quartz.simpl.RAMJobStore' - which does not support persistence. and is not clustered. + +2025-04-17 11:04:31.090 INFO 9791 --- [restartedMain] org.quartz.impl.StdSchedulerFactory : Quartz scheduler 'quartzScheduler' initialized from an externally provided properties instance. +2025-04-17 11:04:31.090 INFO 9791 --- [restartedMain] org.quartz.impl.StdSchedulerFactory : Quartz scheduler version: 2.3.2 +2025-04-17 11:04:31.090 INFO 9791 --- [restartedMain] org.quartz.core.QuartzScheduler : JobFactory set to: org.springframework.scheduling.quartz.SpringBeanJobFactory@52924ecb +2025-04-17 11:04:31.121 INFO 9791 --- [restartedMain] o.s.s.web.DefaultSecurityFilterChain : Creating filter chain: any request, [org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter@17a41b8d, org.springframework.security.web.context.SecurityContextPersistenceFilter@1d50694, org.springframework.security.web.header.HeaderWriterFilter@44d9fa90, org.springframework.web.filter.CorsFilter@7d551669, org.springframework.security.web.authentication.logout.LogoutFilter@6009cd53, com.mingchen.common.config.JwtLoginFilter@2fe81772, com.mingchen.common.config.JwtFilter@28432635, org.springframework.security.web.savedrequest.RequestCacheAwareFilter@25fdf3b8, org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter@637883db, org.springframework.security.web.authentication.AnonymousAuthenticationFilter@1f8c28c3, org.springframework.security.web.session.SessionManagementFilter@603bd666, org.springframework.security.web.access.ExceptionTranslationFilter@9fd60e9, org.springframework.security.web.access.intercept.FilterSecurityInterceptor@4bb48b0f] +2025-04-17 11:04:31.132 INFO 9791 --- [restartedMain] o.s.b.d.a.OptionalLiveReloadServer : LiveReload server is running on port 35729 +2025-04-17 11:04:31.141 INFO 9791 --- [restartedMain] o.s.s.quartz.SchedulerFactoryBean : Starting Quartz Scheduler now +2025-04-17 11:04:31.141 INFO 9791 --- [restartedMain] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED started. +2025-04-17 11:04:31.150 INFO 9791 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 9092 (http) with context path '' +2025-04-17 11:04:31.152 INFO 9791 --- [restartedMain] com.mingchen.BlogApiApplication : Started BlogApiApplication in 1.4 seconds (JVM running for 1.706) +2025-04-17 11:04:35.833 INFO 9791 --- [http-nio-9092-exec-2] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet' +2025-04-17 11:04:35.833 INFO 9791 --- [http-nio-9092-exec-2] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet' +2025-04-17 11:04:35.836 INFO 9791 --- [http-nio-9092-exec-2] o.s.web.servlet.DispatcherServlet : Completed initialization in 3 ms +2025-04-17 11:04:38.283 INFO 9791 --- [http-nio-9092-exec-2] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting... +2025-04-17 11:04:39.118 INFO 9791 --- [http-nio-9092-exec-2] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed. +2025-04-17 11:04:39.154 DEBUG 9791 --- [http-nio-9092-exec-2] c.m.m.L.selectList : ==> Preparing: SELECT resource_id,title,type,url,duration,description FROM learning_resources +2025-04-17 11:04:39.277 DEBUG 9791 --- [http-nio-9092-exec-2] c.m.m.L.selectList : ==> Parameters: +2025-04-17 11:05:12.631 ERROR 9791 --- [http-nio-9092-exec-2] c.m.c.h.ControllerExceptionHandler : Request URL : http://localhost:9092/admin/learningResources/page, Exception : + +org.springframework.jdbc.BadSqlGrammarException: +### Error querying database. Cause: java.sql.SQLSyntaxErrorException: Table 'legal.learning_resources' doesn't exist +### The error may exist in com/mingchen/mapper/LearningResourcesMapper.java (best guess) +### The error may involve defaultParameterMap +### The error occurred while setting parameters +### SQL: SELECT resource_id,title,type,url,duration,description FROM learning_resources +### Cause: java.sql.SQLSyntaxErrorException: Table 'legal.learning_resources' doesn't exist +; bad SQL grammar []; nested exception is java.sql.SQLSyntaxErrorException: Table 'legal.learning_resources' doesn't exist + at org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.doTranslate(SQLErrorCodeSQLExceptionTranslator.java:235) + at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:72) + at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:91) + at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:441) + at jdk.proxy2/jdk.proxy2.$Proxy85.selectList(Unknown Source) + at org.mybatis.spring.SqlSessionTemplate.selectList(SqlSessionTemplate.java:224) + at com.baomidou.mybatisplus.core.override.MybatisMapperMethod.executeForMany(MybatisMapperMethod.java:164) + at com.baomidou.mybatisplus.core.override.MybatisMapperMethod.execute(MybatisMapperMethod.java:77) + at com.baomidou.mybatisplus.core.override.MybatisMapperProxy$PlainMethodInvoker.invoke(MybatisMapperProxy.java:152) + at com.baomidou.mybatisplus.core.override.MybatisMapperProxy.invoke(MybatisMapperProxy.java:89) + at jdk.proxy3/jdk.proxy3.$Proxy88.selectList(Unknown Source) + at com.mingchen.service.impl.LearningResourcesServiceImpl.getLearningResources(LearningResourcesServiceImpl.java:34) + at com.mingchen.service.impl.LearningResourcesServiceImpl$$FastClassBySpringCGLIB$$d7671a85.invoke() + at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) + at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:687) + at com.mingchen.service.impl.LearningResourcesServiceImpl$$EnhancerBySpringCGLIB$$b626a.getLearningResources() + at com.mingchen.api.open.LearningResourcesController.getLearningResources(LearningResourcesController.java:31) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:569) + at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:190) + at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:138) + at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:105) + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:879) + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:793) + at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) + at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1040) + at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943) + at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) + at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898) + at javax.servlet.http.HttpServlet.service(HttpServlet.java:503) + at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) + at javax.servlet.http.HttpServlet.service(HttpServlet.java:590) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:320) + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:126) + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:90) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:118) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:137) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:111) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:158) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at com.mingchen.common.config.JwtFilter.doFilter(JwtFilter.java:68) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:200) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:116) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:92) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:92) + at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:77) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:105) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:56) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:215) + at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:178) + at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:358) + at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:271) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202) + at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) + at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541) + at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139) + at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) + at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) + at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) + at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:373) + at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) + at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868) + at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1590) + at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) + at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) + at java.base/java.lang.Thread.run(Thread.java:840) +Caused by: java.sql.SQLSyntaxErrorException: Table 'legal.learning_resources' doesn't exist + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:120) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:97) + at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122) + at com.mysql.cj.jdbc.ClientPreparedStatement.executeInternal(ClientPreparedStatement.java:953) + at com.mysql.cj.jdbc.ClientPreparedStatement.execute(ClientPreparedStatement.java:370) + at com.zaxxer.hikari.pool.ProxyPreparedStatement.execute(ProxyPreparedStatement.java:44) + at com.zaxxer.hikari.pool.HikariProxyPreparedStatement.execute(HikariProxyPreparedStatement.java) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:569) + at org.apache.ibatis.logging.jdbc.PreparedStatementLogger.invoke(PreparedStatementLogger.java:58) + at jdk.proxy4/jdk.proxy4.$Proxy115.execute(Unknown Source) + at org.apache.ibatis.executor.statement.PreparedStatementHandler.query(PreparedStatementHandler.java:65) + at org.apache.ibatis.executor.statement.RoutingStatementHandler.query(RoutingStatementHandler.java:80) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:569) + at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:61) + at jdk.proxy2/jdk.proxy2.$Proxy113.query(Unknown Source) + at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:65) + at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:336) + at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:158) + at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:110) + at com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor.intercept(MybatisPlusInterceptor.java:81) + at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:59) + at jdk.proxy2/jdk.proxy2.$Proxy112.query(Unknown Source) + at com.github.pagehelper.PageInterceptor.intercept(PageInterceptor.java:108) + at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:59) + at jdk.proxy2/jdk.proxy2.$Proxy112.query(Unknown Source) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:154) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:147) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:142) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:569) + at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:427) + ... 101 common frames omitted + +2025-04-17 11:05:12.657 WARN 9791 --- [http-nio-9092-exec-2] .m.m.a.ExceptionHandlerExceptionResolver : Resolved [org.springframework.jdbc.BadSqlGrammarException: +### Error querying database. Cause: java.sql.SQLSyntaxErrorException: Table 'legal.learning_resources' doesn't exist +### The error may exist in com/mingchen/mapper/LearningResourcesMapper.java (best guess) +### The error may involve defaultParameterMap +### The error occurred while setting parameters +### SQL: SELECT resource_id,title,type,url,duration,description FROM learning_resources +### Cause: java.sql.SQLSyntaxErrorException: Table 'legal.learning_resources' doesn't exist +; bad SQL grammar []; nested exception is java.sql.SQLSyntaxErrorException: Table 'legal.learning_resources' doesn't exist] +2025-04-17 11:06:06.485 INFO 9791 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED paused. +2025-04-17 11:06:06.487 INFO 9791 --- [SpringContextShutdownHook] o.s.s.quartz.SchedulerFactoryBean : Shutting down Quartz Scheduler +2025-04-17 11:06:06.487 INFO 9791 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED shutting down. +2025-04-17 11:06:06.487 INFO 9791 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED paused. +2025-04-17 11:06:06.487 INFO 9791 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED shutdown complete. +2025-04-17 11:06:06.487 INFO 9791 --- [SpringContextShutdownHook] o.s.s.concurrent.ThreadPoolTaskExecutor : Shutting down ExecutorService 'applicationTaskExecutor' +2025-04-17 11:06:06.494 INFO 9791 --- [SpringContextShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown initiated... +2025-04-17 11:06:06.497 INFO 9791 --- [SpringContextShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown completed. +2025-04-17 11:06:08.838 INFO 9880 --- [restartedMain] com.mingchen.BlogApiApplication : Starting BlogApiApplication on mingchendeMac-mini.local with PID 9880 (/Users/mingchen/code/java/other/legalAid/api/target/classes started by mingchen in /Users/mingchen/code/java/other/legalAid) +2025-04-17 11:06:08.840 DEBUG 9880 --- [restartedMain] com.mingchen.BlogApiApplication : Running with Spring Boot v2.2.7.RELEASE, Spring v5.2.6.RELEASE +2025-04-17 11:06:08.840 INFO 9880 --- [restartedMain] com.mingchen.BlogApiApplication : The following profiles are active: dev +2025-04-17 11:06:08.859 INFO 9880 --- [restartedMain] o.s.b.devtools.restart.ChangeableUrls : The Class-Path manifest attribute in /usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/jaxb-runtime-2.3.1.jar referenced one or more files that do not exist: file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/jaxb-api-2.3.1.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/txw2-2.3.1.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/istack-commons-runtime-3.0.7.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/stax-ex-1.8.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/FastInfoset-1.2.15.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/javax.activation-api-1.2.0.jar +2025-04-17 11:06:08.859 INFO 9880 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : Devtools property defaults active! Set 'spring.devtools.add-properties' to 'false' to disable +2025-04-17 11:06:08.859 INFO 9880 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : For additional web related logging consider setting the 'logging.level.web' property to 'DEBUG' +2025-04-17 11:06:09.085 INFO 9880 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Multiple Spring Data modules found, entering strict repository configuration mode! +2025-04-17 11:06:09.086 INFO 9880 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data Redis repositories in DEFAULT mode. +2025-04-17 11:06:09.097 INFO 9880 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 7ms. Found 0 Redis repository interfaces. +2025-04-17 11:06:09.371 INFO 9880 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 9092 (http) +2025-04-17 11:06:09.374 INFO 9880 --- [restartedMain] o.apache.catalina.core.StandardService : Starting service [Tomcat] +2025-04-17 11:06:09.374 INFO 9880 --- [restartedMain] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.34] +2025-04-17 11:06:09.398 INFO 9880 --- [restartedMain] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext +2025-04-17 11:06:09.398 INFO 9880 --- [restartedMain] o.s.web.context.ContextLoader : Root WebApplicationContext: initialization completed in 539 ms +2025-04-17 11:06:09.918 INFO 9880 --- [restartedMain] n.b.p.u.AbstractUserAgentAnalyzerDirect : - Loaded 90 files in 208 msec using expression: classpath*:UserAgents/**/*.yaml +2025-04-17 11:06:09.919 INFO 9880 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : +2025-04-17 11:06:09.919 INFO 9880 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : /-----------------------------------------------------------\ +2025-04-17 11:06:09.919 INFO 9880 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : | Yauaa 5.20 (v5.20 @ 2020-11-22T15:39:16Z) | +2025-04-17 11:06:09.919 INFO 9880 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : +-----------------------------------------------------------+ +2025-04-17 11:06:09.919 INFO 9880 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : | For more information: https://yauaa.basjes.nl | +2025-04-17 11:06:09.919 INFO 9880 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : | Copyright (C) 2013-2020 Niels Basjes - License Apache 2.0 | +2025-04-17 11:06:09.919 INFO 9880 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : \-----------------------------------------------------------/ +2025-04-17 11:06:09.919 INFO 9880 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : +2025-04-17 11:06:09.923 INFO 9880 --- [restartedMain] n.b.p.u.AbstractUserAgentAnalyzerDirect : Building all needed matchers for the requested 11 fields. +2025-04-17 11:06:09.978 INFO 9880 --- [restartedMain] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor' +2025-04-17 11:06:10.072 INFO 9880 --- [restartedMain] org.quartz.impl.StdSchedulerFactory : Using default implementation for ThreadExecutor +2025-04-17 11:06:10.082 INFO 9880 --- [restartedMain] org.quartz.core.SchedulerSignalerImpl : Initialized Scheduler Signaller of type: class org.quartz.core.SchedulerSignalerImpl +2025-04-17 11:06:10.083 INFO 9880 --- [restartedMain] org.quartz.core.QuartzScheduler : Quartz Scheduler v.2.3.2 created. +2025-04-17 11:06:10.083 INFO 9880 --- [restartedMain] org.quartz.simpl.RAMJobStore : RAMJobStore initialized. +2025-04-17 11:06:10.083 INFO 9880 --- [restartedMain] org.quartz.core.QuartzScheduler : Scheduler meta-data: Quartz Scheduler (v2.3.2) 'quartzScheduler' with instanceId 'NON_CLUSTERED' + Scheduler class: 'org.quartz.core.QuartzScheduler' - running locally. + NOT STARTED. + Currently in standby mode. + Number of jobs executed: 0 + Using thread pool 'org.quartz.simpl.SimpleThreadPool' - with 10 threads. + Using job-store 'org.quartz.simpl.RAMJobStore' - which does not support persistence. and is not clustered. + +2025-04-17 11:06:10.083 INFO 9880 --- [restartedMain] org.quartz.impl.StdSchedulerFactory : Quartz scheduler 'quartzScheduler' initialized from an externally provided properties instance. +2025-04-17 11:06:10.083 INFO 9880 --- [restartedMain] org.quartz.impl.StdSchedulerFactory : Quartz scheduler version: 2.3.2 +2025-04-17 11:06:10.083 INFO 9880 --- [restartedMain] org.quartz.core.QuartzScheduler : JobFactory set to: org.springframework.scheduling.quartz.SpringBeanJobFactory@3f25bdf9 +2025-04-17 11:06:10.121 INFO 9880 --- [restartedMain] o.s.s.web.DefaultSecurityFilterChain : Creating filter chain: any request, [org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter@15f3210c, org.springframework.security.web.context.SecurityContextPersistenceFilter@580c412f, org.springframework.security.web.header.HeaderWriterFilter@fbba2af, org.springframework.web.filter.CorsFilter@7e42b6f5, org.springframework.security.web.authentication.logout.LogoutFilter@2d011b1f, com.mingchen.common.config.JwtLoginFilter@32765e, com.mingchen.common.config.JwtFilter@c12db8c, org.springframework.security.web.savedrequest.RequestCacheAwareFilter@799d0d44, org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter@7aae023f, org.springframework.security.web.authentication.AnonymousAuthenticationFilter@e56043, org.springframework.security.web.session.SessionManagementFilter@17d9867a, org.springframework.security.web.access.ExceptionTranslationFilter@3ef9e446, org.springframework.security.web.access.intercept.FilterSecurityInterceptor@3b4d3709] +2025-04-17 11:06:10.133 INFO 9880 --- [restartedMain] o.s.b.d.a.OptionalLiveReloadServer : LiveReload server is running on port 35729 +2025-04-17 11:06:10.142 INFO 9880 --- [restartedMain] o.s.s.quartz.SchedulerFactoryBean : Starting Quartz Scheduler now +2025-04-17 11:06:10.142 INFO 9880 --- [restartedMain] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED started. +2025-04-17 11:06:10.152 INFO 9880 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 9092 (http) with context path '' +2025-04-17 11:06:10.154 INFO 9880 --- [restartedMain] com.mingchen.BlogApiApplication : Started BlogApiApplication in 1.496 seconds (JVM running for 1.786) +2025-04-17 11:06:18.081 INFO 9880 --- [http-nio-9092-exec-2] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet' +2025-04-17 11:06:18.082 INFO 9880 --- [http-nio-9092-exec-2] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet' +2025-04-17 11:06:18.083 INFO 9880 --- [http-nio-9092-exec-2] o.s.web.servlet.DispatcherServlet : Completed initialization in 1 ms +2025-04-17 11:06:19.994 INFO 9880 --- [http-nio-9092-exec-2] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting... +2025-04-17 11:06:20.870 INFO 9880 --- [http-nio-9092-exec-2] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed. +2025-04-17 11:06:20.907 DEBUG 9880 --- [http-nio-9092-exec-2] c.m.m.L.selectList : ==> Preparing: SELECT resource_id,title,type,url,duration,description FROM learningResources +2025-04-17 11:06:21.029 DEBUG 9880 --- [http-nio-9092-exec-2] c.m.m.L.selectList : ==> Parameters: +2025-04-17 11:06:21.212 DEBUG 9880 --- [http-nio-9092-exec-2] c.m.m.L.selectList : <== Total: 0 +2025-04-17 11:06:34.863 DEBUG 9880 --- [http-nio-9092-exec-2] c.m.m.L.selectList_mpCount : ==> Preparing: SELECT COUNT() FROM learningResources +2025-04-17 11:06:34.864 DEBUG 9880 --- [http-nio-9092-exec-2] c.m.m.L.selectList_mpCount : ==> Parameters: +2025-04-17 11:06:37.471 ERROR 9880 --- [http-nio-9092-exec-2] c.m.c.h.ControllerExceptionHandler : Request URL : http://localhost:9092/admin/learningResources/page, Exception : + +org.springframework.jdbc.BadSqlGrammarException: +### Error querying database. Cause: java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') FROM learningResources' at line 1 +### The error may exist in com/mingchen/mapper/LearningResourcesMapper.java (best guess) +### The error may involve defaultParameterMap +### The error occurred while setting parameters +### SQL: SELECT COUNT() FROM learningResources +### Cause: java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') FROM learningResources' at line 1 +; bad SQL grammar []; nested exception is java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') FROM learningResources' at line 1 + at org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.doTranslate(SQLErrorCodeSQLExceptionTranslator.java:235) + at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:72) + at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:91) + at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:441) + at jdk.proxy2/jdk.proxy2.$Proxy85.selectList(Unknown Source) + at org.mybatis.spring.SqlSessionTemplate.selectList(SqlSessionTemplate.java:224) + at com.baomidou.mybatisplus.core.override.MybatisMapperMethod.executeForMany(MybatisMapperMethod.java:164) + at com.baomidou.mybatisplus.core.override.MybatisMapperMethod.execute(MybatisMapperMethod.java:77) + at com.baomidou.mybatisplus.core.override.MybatisMapperProxy$PlainMethodInvoker.invoke(MybatisMapperProxy.java:152) + at com.baomidou.mybatisplus.core.override.MybatisMapperProxy.invoke(MybatisMapperProxy.java:89) + at jdk.proxy3/jdk.proxy3.$Proxy88.selectList(Unknown Source) + at com.baomidou.mybatisplus.core.mapper.BaseMapper.selectPage(BaseMapper.java:348) + at java.base/java.lang.invoke.MethodHandle.invokeWithArguments(MethodHandle.java:732) + at com.baomidou.mybatisplus.core.override.MybatisMapperProxy$DefaultMethodInvoker.invoke(MybatisMapperProxy.java:166) + at com.baomidou.mybatisplus.core.override.MybatisMapperProxy.invoke(MybatisMapperProxy.java:89) + at jdk.proxy3/jdk.proxy3.$Proxy88.selectPage(Unknown Source) + at com.mingchen.service.impl.LearningResourcesServiceImpl.getLearningResources(LearningResourcesServiceImpl.java:42) + at com.mingchen.service.impl.LearningResourcesServiceImpl$$FastClassBySpringCGLIB$$d7671a85.invoke() + at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) + at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:687) + at com.mingchen.service.impl.LearningResourcesServiceImpl$$EnhancerBySpringCGLIB$$8a610e.getLearningResources() + at com.mingchen.api.open.LearningResourcesController.getLearningResources(LearningResourcesController.java:31) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:569) + at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:190) + at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:138) + at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:105) + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:879) + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:793) + at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) + at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1040) + at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943) + at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) + at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898) + at javax.servlet.http.HttpServlet.service(HttpServlet.java:503) + at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) + at javax.servlet.http.HttpServlet.service(HttpServlet.java:590) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:320) + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:126) + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:90) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:118) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:137) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:111) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:158) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at com.mingchen.common.config.JwtFilter.doFilter(JwtFilter.java:68) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:200) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:116) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:92) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:92) + at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:77) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:105) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:56) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:215) + at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:178) + at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:358) + at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:271) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202) + at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) + at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541) + at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139) + at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) + at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) + at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) + at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:373) + at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) + at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868) + at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1590) + at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) + at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) + at java.base/java.lang.Thread.run(Thread.java:840) +Caused by: java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') FROM learningResources' at line 1 + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:120) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:97) + at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122) + at com.mysql.cj.jdbc.ClientPreparedStatement.executeInternal(ClientPreparedStatement.java:953) + at com.mysql.cj.jdbc.ClientPreparedStatement.execute(ClientPreparedStatement.java:370) + at com.zaxxer.hikari.pool.ProxyPreparedStatement.execute(ProxyPreparedStatement.java:44) + at com.zaxxer.hikari.pool.HikariProxyPreparedStatement.execute(HikariProxyPreparedStatement.java) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:569) + at org.apache.ibatis.logging.jdbc.PreparedStatementLogger.invoke(PreparedStatementLogger.java:58) + at jdk.proxy4/jdk.proxy4.$Proxy115.execute(Unknown Source) + at org.apache.ibatis.executor.statement.PreparedStatementHandler.query(PreparedStatementHandler.java:65) + at org.apache.ibatis.executor.statement.RoutingStatementHandler.query(RoutingStatementHandler.java:80) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:569) + at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:61) + at jdk.proxy2/jdk.proxy2.$Proxy113.query(Unknown Source) + at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:65) + at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:336) + at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:158) + at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:110) + at com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor.willDoQuery(PaginationInnerInterceptor.java:141) + at com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor.intercept(MybatisPlusInterceptor.java:75) + at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:59) + at jdk.proxy2/jdk.proxy2.$Proxy112.query(Unknown Source) + at com.github.pagehelper.PageInterceptor.intercept(PageInterceptor.java:108) + at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:59) + at jdk.proxy2/jdk.proxy2.$Proxy112.query(Unknown Source) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:154) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:147) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:142) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:569) + at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:427) + ... 106 common frames omitted + +2025-04-17 11:06:37.496 WARN 9880 --- [http-nio-9092-exec-2] .m.m.a.ExceptionHandlerExceptionResolver : Resolved [org.springframework.jdbc.BadSqlGrammarException: +### Error querying database. Cause: java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') FROM learningResources' at line 1 +### The error may exist in com/mingchen/mapper/LearningResourcesMapper.java (best guess) +### The error may involve defaultParameterMap +### The error occurred while setting parameters +### SQL: SELECT COUNT() FROM learningResources +### Cause: java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') FROM learningResources' at line 1 +; bad SQL grammar []; nested exception is java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') FROM learningResources' at line 1] +2025-04-17 11:07:27.178 DEBUG 9880 --- [http-nio-9092-exec-3] c.m.m.L.selectList : ==> Preparing: SELECT resource_id,title,type,url,duration,description FROM learningResources +2025-04-17 11:07:27.180 DEBUG 9880 --- [http-nio-9092-exec-3] c.m.m.L.selectList : ==> Parameters: +2025-04-17 11:07:27.226 ERROR 9880 --- [http-nio-9092-exec-3] c.m.c.h.ControllerExceptionHandler : Request URL : http://localhost:9092/admin/learningResources/page, Exception : + +org.springframework.jdbc.BadSqlGrammarException: +### Error querying database. Cause: java.sql.SQLSyntaxErrorException: Table 'legal.learningResources' doesn't exist +### The error may exist in com/mingchen/mapper/LearningResourcesMapper.java (best guess) +### The error may involve defaultParameterMap +### The error occurred while setting parameters +### SQL: SELECT resource_id,title,type,url,duration,description FROM learningResources +### Cause: java.sql.SQLSyntaxErrorException: Table 'legal.learningResources' doesn't exist +; bad SQL grammar []; nested exception is java.sql.SQLSyntaxErrorException: Table 'legal.learningResources' doesn't exist + at org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.doTranslate(SQLErrorCodeSQLExceptionTranslator.java:235) + at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:72) + at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:91) + at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:441) + at jdk.proxy2/jdk.proxy2.$Proxy85.selectList(Unknown Source) + at org.mybatis.spring.SqlSessionTemplate.selectList(SqlSessionTemplate.java:224) + at com.baomidou.mybatisplus.core.override.MybatisMapperMethod.executeForMany(MybatisMapperMethod.java:164) + at com.baomidou.mybatisplus.core.override.MybatisMapperMethod.execute(MybatisMapperMethod.java:77) + at com.baomidou.mybatisplus.core.override.MybatisMapperProxy$PlainMethodInvoker.invoke(MybatisMapperProxy.java:152) + at com.baomidou.mybatisplus.core.override.MybatisMapperProxy.invoke(MybatisMapperProxy.java:89) + at jdk.proxy3/jdk.proxy3.$Proxy88.selectList(Unknown Source) + at com.mingchen.service.impl.LearningResourcesServiceImpl.getLearningResources(LearningResourcesServiceImpl.java:34) + at com.mingchen.service.impl.LearningResourcesServiceImpl$$FastClassBySpringCGLIB$$d7671a85.invoke() + at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) + at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:687) + at com.mingchen.service.impl.LearningResourcesServiceImpl$$EnhancerBySpringCGLIB$$8a610e.getLearningResources() + at com.mingchen.api.open.LearningResourcesController.getLearningResources(LearningResourcesController.java:31) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:569) + at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:190) + at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:138) + at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:105) + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:879) + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:793) + at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) + at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1040) + at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943) + at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) + at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898) + at javax.servlet.http.HttpServlet.service(HttpServlet.java:503) + at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) + at javax.servlet.http.HttpServlet.service(HttpServlet.java:590) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:320) + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:126) + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:90) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:118) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:137) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:111) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:158) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at com.mingchen.common.config.JwtFilter.doFilter(JwtFilter.java:68) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:200) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:116) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:92) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:92) + at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:77) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:105) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:56) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:215) + at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:178) + at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:358) + at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:271) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202) + at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) + at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541) + at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139) + at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) + at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) + at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) + at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:373) + at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) + at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868) + at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1590) + at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) + at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) + at java.base/java.lang.Thread.run(Thread.java:840) +Caused by: java.sql.SQLSyntaxErrorException: Table 'legal.learningResources' doesn't exist + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:120) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:97) + at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122) + at com.mysql.cj.jdbc.ClientPreparedStatement.executeInternal(ClientPreparedStatement.java:953) + at com.mysql.cj.jdbc.ClientPreparedStatement.execute(ClientPreparedStatement.java:370) + at com.zaxxer.hikari.pool.ProxyPreparedStatement.execute(ProxyPreparedStatement.java:44) + at com.zaxxer.hikari.pool.HikariProxyPreparedStatement.execute(HikariProxyPreparedStatement.java) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:569) + at org.apache.ibatis.logging.jdbc.PreparedStatementLogger.invoke(PreparedStatementLogger.java:58) + at jdk.proxy4/jdk.proxy4.$Proxy115.execute(Unknown Source) + at org.apache.ibatis.executor.statement.PreparedStatementHandler.query(PreparedStatementHandler.java:65) + at org.apache.ibatis.executor.statement.RoutingStatementHandler.query(RoutingStatementHandler.java:80) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:569) + at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:61) + at jdk.proxy2/jdk.proxy2.$Proxy113.query(Unknown Source) + at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:65) + at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:336) + at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:158) + at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:110) + at com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor.intercept(MybatisPlusInterceptor.java:81) + at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:59) + at jdk.proxy2/jdk.proxy2.$Proxy112.query(Unknown Source) + at com.github.pagehelper.PageInterceptor.intercept(PageInterceptor.java:108) + at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:59) + at jdk.proxy2/jdk.proxy2.$Proxy112.query(Unknown Source) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:154) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:147) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:142) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:569) + at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:427) + ... 101 common frames omitted + +2025-04-17 11:07:27.229 WARN 9880 --- [http-nio-9092-exec-3] .m.m.a.ExceptionHandlerExceptionResolver : Resolved [org.springframework.jdbc.BadSqlGrammarException: +### Error querying database. Cause: java.sql.SQLSyntaxErrorException: Table 'legal.learningResources' doesn't exist +### The error may exist in com/mingchen/mapper/LearningResourcesMapper.java (best guess) +### The error may involve defaultParameterMap +### The error occurred while setting parameters +### SQL: SELECT resource_id,title,type,url,duration,description FROM learningResources +### Cause: java.sql.SQLSyntaxErrorException: Table 'legal.learningResources' doesn't exist +; bad SQL grammar []; nested exception is java.sql.SQLSyntaxErrorException: Table 'legal.learningResources' doesn't exist] +2025-04-17 11:07:35.093 DEBUG 9880 --- [http-nio-9092-exec-4] c.m.m.L.selectList : ==> Preparing: SELECT resource_id,title,type,url,duration,description FROM learningResources +2025-04-17 11:07:35.093 DEBUG 9880 --- [http-nio-9092-exec-4] c.m.m.L.selectList : ==> Parameters: +2025-04-17 11:07:35.147 ERROR 9880 --- [http-nio-9092-exec-4] c.m.c.h.ControllerExceptionHandler : Request URL : http://localhost:9092/admin/learningResources/page, Exception : + +org.springframework.jdbc.BadSqlGrammarException: +### Error querying database. Cause: java.sql.SQLSyntaxErrorException: Table 'legal.learningResources' doesn't exist +### The error may exist in com/mingchen/mapper/LearningResourcesMapper.java (best guess) +### The error may involve defaultParameterMap +### The error occurred while setting parameters +### SQL: SELECT resource_id,title,type,url,duration,description FROM learningResources +### Cause: java.sql.SQLSyntaxErrorException: Table 'legal.learningResources' doesn't exist +; bad SQL grammar []; nested exception is java.sql.SQLSyntaxErrorException: Table 'legal.learningResources' doesn't exist + at org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.doTranslate(SQLErrorCodeSQLExceptionTranslator.java:235) + at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:72) + at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:91) + at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:441) + at jdk.proxy2/jdk.proxy2.$Proxy85.selectList(Unknown Source) + at org.mybatis.spring.SqlSessionTemplate.selectList(SqlSessionTemplate.java:224) + at com.baomidou.mybatisplus.core.override.MybatisMapperMethod.executeForMany(MybatisMapperMethod.java:164) + at com.baomidou.mybatisplus.core.override.MybatisMapperMethod.execute(MybatisMapperMethod.java:77) + at com.baomidou.mybatisplus.core.override.MybatisMapperProxy$PlainMethodInvoker.invoke(MybatisMapperProxy.java:152) + at com.baomidou.mybatisplus.core.override.MybatisMapperProxy.invoke(MybatisMapperProxy.java:89) + at jdk.proxy3/jdk.proxy3.$Proxy88.selectList(Unknown Source) + at com.mingchen.service.impl.LearningResourcesServiceImpl.getLearningResources(LearningResourcesServiceImpl.java:34) + at com.mingchen.service.impl.LearningResourcesServiceImpl$$FastClassBySpringCGLIB$$d7671a85.invoke() + at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) + at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:687) + at com.mingchen.service.impl.LearningResourcesServiceImpl$$EnhancerBySpringCGLIB$$8a610e.getLearningResources() + at com.mingchen.api.open.LearningResourcesController.getLearningResources(LearningResourcesController.java:31) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:569) + at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:190) + at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:138) + at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:105) + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:879) + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:793) + at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) + at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1040) + at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943) + at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) + at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898) + at javax.servlet.http.HttpServlet.service(HttpServlet.java:503) + at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) + at javax.servlet.http.HttpServlet.service(HttpServlet.java:590) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:320) + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:126) + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:90) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:118) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:137) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:111) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:158) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at com.mingchen.common.config.JwtFilter.doFilter(JwtFilter.java:68) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:200) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:116) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:92) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:92) + at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:77) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:105) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:56) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:215) + at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:178) + at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:358) + at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:271) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202) + at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) + at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541) + at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139) + at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) + at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) + at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) + at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:373) + at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) + at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868) + at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1590) + at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) + at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) + at java.base/java.lang.Thread.run(Thread.java:840) +Caused by: java.sql.SQLSyntaxErrorException: Table 'legal.learningResources' doesn't exist + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:120) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:97) + at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122) + at com.mysql.cj.jdbc.ClientPreparedStatement.executeInternal(ClientPreparedStatement.java:953) + at com.mysql.cj.jdbc.ClientPreparedStatement.execute(ClientPreparedStatement.java:370) + at com.zaxxer.hikari.pool.ProxyPreparedStatement.execute(ProxyPreparedStatement.java:44) + at com.zaxxer.hikari.pool.HikariProxyPreparedStatement.execute(HikariProxyPreparedStatement.java) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:569) + at org.apache.ibatis.logging.jdbc.PreparedStatementLogger.invoke(PreparedStatementLogger.java:58) + at jdk.proxy4/jdk.proxy4.$Proxy115.execute(Unknown Source) + at org.apache.ibatis.executor.statement.PreparedStatementHandler.query(PreparedStatementHandler.java:65) + at org.apache.ibatis.executor.statement.RoutingStatementHandler.query(RoutingStatementHandler.java:80) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:569) + at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:61) + at jdk.proxy2/jdk.proxy2.$Proxy113.query(Unknown Source) + at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:65) + at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:336) + at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:158) + at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:110) + at com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor.intercept(MybatisPlusInterceptor.java:81) + at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:59) + at jdk.proxy2/jdk.proxy2.$Proxy112.query(Unknown Source) + at com.github.pagehelper.PageInterceptor.intercept(PageInterceptor.java:108) + at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:59) + at jdk.proxy2/jdk.proxy2.$Proxy112.query(Unknown Source) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:154) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:147) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:142) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:569) + at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:427) + ... 101 common frames omitted + +2025-04-17 11:07:35.148 WARN 9880 --- [http-nio-9092-exec-4] .m.m.a.ExceptionHandlerExceptionResolver : Resolved [org.springframework.jdbc.BadSqlGrammarException: +### Error querying database. Cause: java.sql.SQLSyntaxErrorException: Table 'legal.learningResources' doesn't exist +### The error may exist in com/mingchen/mapper/LearningResourcesMapper.java (best guess) +### The error may involve defaultParameterMap +### The error occurred while setting parameters +### SQL: SELECT resource_id,title,type,url,duration,description FROM learningResources +### Cause: java.sql.SQLSyntaxErrorException: Table 'legal.learningResources' doesn't exist +; bad SQL grammar []; nested exception is java.sql.SQLSyntaxErrorException: Table 'legal.learningResources' doesn't exist] +2025-04-17 11:07:39.178 INFO 9880 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED paused. +2025-04-17 11:07:39.180 INFO 9880 --- [SpringContextShutdownHook] o.s.s.quartz.SchedulerFactoryBean : Shutting down Quartz Scheduler +2025-04-17 11:07:39.180 INFO 9880 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED shutting down. +2025-04-17 11:07:39.180 INFO 9880 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED paused. +2025-04-17 11:07:39.180 INFO 9880 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED shutdown complete. +2025-04-17 11:07:39.180 INFO 9880 --- [SpringContextShutdownHook] o.s.s.concurrent.ThreadPoolTaskExecutor : Shutting down ExecutorService 'applicationTaskExecutor' +2025-04-17 11:07:39.187 INFO 9880 --- [SpringContextShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown initiated... +2025-04-17 11:07:39.189 INFO 9880 --- [SpringContextShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown completed. +2025-04-17 11:07:41.985 INFO 9972 --- [restartedMain] com.mingchen.BlogApiApplication : Starting BlogApiApplication on mingchendeMac-mini.local with PID 9972 (/Users/mingchen/code/java/other/legalAid/api/target/classes started by mingchen in /Users/mingchen/code/java/other/legalAid) +2025-04-17 11:07:41.988 DEBUG 9972 --- [restartedMain] com.mingchen.BlogApiApplication : Running with Spring Boot v2.2.7.RELEASE, Spring v5.2.6.RELEASE +2025-04-17 11:07:41.988 INFO 9972 --- [restartedMain] com.mingchen.BlogApiApplication : The following profiles are active: dev +2025-04-17 11:07:42.006 INFO 9972 --- [restartedMain] o.s.b.devtools.restart.ChangeableUrls : The Class-Path manifest attribute in /usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/jaxb-runtime-2.3.1.jar referenced one or more files that do not exist: file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/jaxb-api-2.3.1.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/txw2-2.3.1.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/istack-commons-runtime-3.0.7.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/stax-ex-1.8.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/FastInfoset-1.2.15.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/javax.activation-api-1.2.0.jar +2025-04-17 11:07:42.006 INFO 9972 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : Devtools property defaults active! Set 'spring.devtools.add-properties' to 'false' to disable +2025-04-17 11:07:42.006 INFO 9972 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : For additional web related logging consider setting the 'logging.level.web' property to 'DEBUG' +2025-04-17 11:07:42.239 INFO 9972 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Multiple Spring Data modules found, entering strict repository configuration mode! +2025-04-17 11:07:42.240 INFO 9972 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data Redis repositories in DEFAULT mode. +2025-04-17 11:07:42.252 INFO 9972 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 7ms. Found 0 Redis repository interfaces. +2025-04-17 11:07:42.500 INFO 9972 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 9092 (http) +2025-04-17 11:07:42.503 INFO 9972 --- [restartedMain] o.apache.catalina.core.StandardService : Starting service [Tomcat] +2025-04-17 11:07:42.504 INFO 9972 --- [restartedMain] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.34] +2025-04-17 11:07:42.525 INFO 9972 --- [restartedMain] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext +2025-04-17 11:07:42.525 INFO 9972 --- [restartedMain] o.s.web.context.ContextLoader : Root WebApplicationContext: initialization completed in 519 ms +2025-04-17 11:07:43.028 INFO 9972 --- [restartedMain] n.b.p.u.AbstractUserAgentAnalyzerDirect : - Loaded 90 files in 209 msec using expression: classpath*:UserAgents/**/*.yaml +2025-04-17 11:07:43.028 INFO 9972 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : +2025-04-17 11:07:43.029 INFO 9972 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : /-----------------------------------------------------------\ +2025-04-17 11:07:43.029 INFO 9972 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : | Yauaa 5.20 (v5.20 @ 2020-11-22T15:39:16Z) | +2025-04-17 11:07:43.029 INFO 9972 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : +-----------------------------------------------------------+ +2025-04-17 11:07:43.029 INFO 9972 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : | For more information: https://yauaa.basjes.nl | +2025-04-17 11:07:43.029 INFO 9972 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : | Copyright (C) 2013-2020 Niels Basjes - License Apache 2.0 | +2025-04-17 11:07:43.029 INFO 9972 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : \-----------------------------------------------------------/ +2025-04-17 11:07:43.029 INFO 9972 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : +2025-04-17 11:07:43.033 INFO 9972 --- [restartedMain] n.b.p.u.AbstractUserAgentAnalyzerDirect : Building all needed matchers for the requested 11 fields. +2025-04-17 11:07:43.086 INFO 9972 --- [restartedMain] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor' +2025-04-17 11:07:43.162 INFO 9972 --- [restartedMain] org.quartz.impl.StdSchedulerFactory : Using default implementation for ThreadExecutor +2025-04-17 11:07:43.166 INFO 9972 --- [restartedMain] org.quartz.core.SchedulerSignalerImpl : Initialized Scheduler Signaller of type: class org.quartz.core.SchedulerSignalerImpl +2025-04-17 11:07:43.166 INFO 9972 --- [restartedMain] org.quartz.core.QuartzScheduler : Quartz Scheduler v.2.3.2 created. +2025-04-17 11:07:43.166 INFO 9972 --- [restartedMain] org.quartz.simpl.RAMJobStore : RAMJobStore initialized. +2025-04-17 11:07:43.166 INFO 9972 --- [restartedMain] org.quartz.core.QuartzScheduler : Scheduler meta-data: Quartz Scheduler (v2.3.2) 'quartzScheduler' with instanceId 'NON_CLUSTERED' + Scheduler class: 'org.quartz.core.QuartzScheduler' - running locally. + NOT STARTED. + Currently in standby mode. + Number of jobs executed: 0 + Using thread pool 'org.quartz.simpl.SimpleThreadPool' - with 10 threads. + Using job-store 'org.quartz.simpl.RAMJobStore' - which does not support persistence. and is not clustered. + +2025-04-17 11:07:43.166 INFO 9972 --- [restartedMain] org.quartz.impl.StdSchedulerFactory : Quartz scheduler 'quartzScheduler' initialized from an externally provided properties instance. +2025-04-17 11:07:43.166 INFO 9972 --- [restartedMain] org.quartz.impl.StdSchedulerFactory : Quartz scheduler version: 2.3.2 +2025-04-17 11:07:43.166 INFO 9972 --- [restartedMain] org.quartz.core.QuartzScheduler : JobFactory set to: org.springframework.scheduling.quartz.SpringBeanJobFactory@315a370f +2025-04-17 11:07:43.197 INFO 9972 --- [restartedMain] o.s.s.web.DefaultSecurityFilterChain : Creating filter chain: any request, [org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter@48ed2938, org.springframework.security.web.context.SecurityContextPersistenceFilter@56cb50ba, org.springframework.security.web.header.HeaderWriterFilter@72ab5da7, org.springframework.web.filter.CorsFilter@5233ee3c, org.springframework.security.web.authentication.logout.LogoutFilter@1645f55b, com.mingchen.common.config.JwtLoginFilter@70b4f21e, com.mingchen.common.config.JwtFilter@217a3b37, org.springframework.security.web.savedrequest.RequestCacheAwareFilter@10135ff9, org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter@1e232be2, org.springframework.security.web.authentication.AnonymousAuthenticationFilter@ff72c9, org.springframework.security.web.session.SessionManagementFilter@3072f9e5, org.springframework.security.web.access.ExceptionTranslationFilter@395ecc1a, org.springframework.security.web.access.intercept.FilterSecurityInterceptor@38515b34] +2025-04-17 11:07:43.208 INFO 9972 --- [restartedMain] o.s.b.d.a.OptionalLiveReloadServer : LiveReload server is running on port 35729 +2025-04-17 11:07:43.217 INFO 9972 --- [restartedMain] o.s.s.quartz.SchedulerFactoryBean : Starting Quartz Scheduler now +2025-04-17 11:07:43.217 INFO 9972 --- [restartedMain] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED started. +2025-04-17 11:07:43.226 INFO 9972 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 9092 (http) with context path '' +2025-04-17 11:07:43.228 INFO 9972 --- [restartedMain] com.mingchen.BlogApiApplication : Started BlogApiApplication in 1.44 seconds (JVM running for 1.77) +2025-04-17 11:07:47.357 INFO 9972 --- [http-nio-9092-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet' +2025-04-17 11:07:47.357 INFO 9972 --- [http-nio-9092-exec-1] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet' +2025-04-17 11:07:47.359 INFO 9972 --- [http-nio-9092-exec-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 2 ms +2025-04-17 11:07:48.998 INFO 9972 --- [http-nio-9092-exec-1] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting... +2025-04-17 11:07:49.835 INFO 9972 --- [http-nio-9092-exec-1] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed. +2025-04-17 11:07:49.873 DEBUG 9972 --- [http-nio-9092-exec-1] c.m.m.L.selectList : ==> Preparing: SELECT resource_id,title,type,url,duration,description FROM learningResources +2025-04-17 11:07:49.997 DEBUG 9972 --- [http-nio-9092-exec-1] c.m.m.L.selectList : ==> Parameters: +2025-04-17 11:08:14.382 ERROR 9972 --- [http-nio-9092-exec-1] c.m.c.h.ControllerExceptionHandler : Request URL : http://localhost:9092/admin/learningResources/page, Exception : + +org.springframework.jdbc.BadSqlGrammarException: +### Error querying database. Cause: java.sql.SQLSyntaxErrorException: Table 'legal.learningResources' doesn't exist +### The error may exist in com/mingchen/mapper/LearningResourcesMapper.java (best guess) +### The error may involve defaultParameterMap +### The error occurred while setting parameters +### SQL: SELECT resource_id,title,type,url,duration,description FROM learningResources +### Cause: java.sql.SQLSyntaxErrorException: Table 'legal.learningResources' doesn't exist +; bad SQL grammar []; nested exception is java.sql.SQLSyntaxErrorException: Table 'legal.learningResources' doesn't exist + at org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.doTranslate(SQLErrorCodeSQLExceptionTranslator.java:235) + at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:72) + at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:91) + at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:441) + at jdk.proxy2/jdk.proxy2.$Proxy85.selectList(Unknown Source) + at org.mybatis.spring.SqlSessionTemplate.selectList(SqlSessionTemplate.java:224) + at com.baomidou.mybatisplus.core.override.MybatisMapperMethod.executeForMany(MybatisMapperMethod.java:164) + at com.baomidou.mybatisplus.core.override.MybatisMapperMethod.execute(MybatisMapperMethod.java:77) + at com.baomidou.mybatisplus.core.override.MybatisMapperProxy$PlainMethodInvoker.invoke(MybatisMapperProxy.java:152) + at com.baomidou.mybatisplus.core.override.MybatisMapperProxy.invoke(MybatisMapperProxy.java:89) + at jdk.proxy3/jdk.proxy3.$Proxy88.selectList(Unknown Source) + at com.mingchen.service.impl.LearningResourcesServiceImpl.getLearningResources(LearningResourcesServiceImpl.java:34) + at com.mingchen.service.impl.LearningResourcesServiceImpl$$FastClassBySpringCGLIB$$d7671a85.invoke() + at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) + at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:687) + at com.mingchen.service.impl.LearningResourcesServiceImpl$$EnhancerBySpringCGLIB$$fc11bc73.getLearningResources() + at com.mingchen.api.open.LearningResourcesController.getLearningResources(LearningResourcesController.java:31) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:569) + at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:190) + at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:138) + at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:105) + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:879) + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:793) + at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) + at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1040) + at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943) + at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) + at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898) + at javax.servlet.http.HttpServlet.service(HttpServlet.java:503) + at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) + at javax.servlet.http.HttpServlet.service(HttpServlet.java:590) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:320) + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:126) + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:90) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:118) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:137) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:111) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:158) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at com.mingchen.common.config.JwtFilter.doFilter(JwtFilter.java:68) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:200) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:116) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:92) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:92) + at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:77) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:105) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:56) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:215) + at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:178) + at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:358) + at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:271) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202) + at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) + at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541) + at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139) + at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) + at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) + at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) + at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:373) + at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) + at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868) + at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1590) + at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) + at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) + at java.base/java.lang.Thread.run(Thread.java:840) +Caused by: java.sql.SQLSyntaxErrorException: Table 'legal.learningResources' doesn't exist + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:120) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:97) + at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122) + at com.mysql.cj.jdbc.ClientPreparedStatement.executeInternal(ClientPreparedStatement.java:953) + at com.mysql.cj.jdbc.ClientPreparedStatement.execute(ClientPreparedStatement.java:370) + at com.zaxxer.hikari.pool.ProxyPreparedStatement.execute(ProxyPreparedStatement.java:44) + at com.zaxxer.hikari.pool.HikariProxyPreparedStatement.execute(HikariProxyPreparedStatement.java) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:569) + at org.apache.ibatis.logging.jdbc.PreparedStatementLogger.invoke(PreparedStatementLogger.java:58) + at jdk.proxy4/jdk.proxy4.$Proxy115.execute(Unknown Source) + at org.apache.ibatis.executor.statement.PreparedStatementHandler.query(PreparedStatementHandler.java:65) + at org.apache.ibatis.executor.statement.RoutingStatementHandler.query(RoutingStatementHandler.java:80) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:569) + at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:61) + at jdk.proxy2/jdk.proxy2.$Proxy113.query(Unknown Source) + at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:65) + at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:336) + at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:158) + at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:110) + at com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor.intercept(MybatisPlusInterceptor.java:81) + at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:59) + at jdk.proxy2/jdk.proxy2.$Proxy112.query(Unknown Source) + at com.github.pagehelper.PageInterceptor.intercept(PageInterceptor.java:108) + at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:59) + at jdk.proxy2/jdk.proxy2.$Proxy112.query(Unknown Source) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:154) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:147) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:142) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:569) + at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:427) + ... 101 common frames omitted + +2025-04-17 11:08:14.414 WARN 9972 --- [http-nio-9092-exec-1] .m.m.a.ExceptionHandlerExceptionResolver : Resolved [org.springframework.jdbc.BadSqlGrammarException: +### Error querying database. Cause: java.sql.SQLSyntaxErrorException: Table 'legal.learningResources' doesn't exist +### The error may exist in com/mingchen/mapper/LearningResourcesMapper.java (best guess) +### The error may involve defaultParameterMap +### The error occurred while setting parameters +### SQL: SELECT resource_id,title,type,url,duration,description FROM learningResources +### Cause: java.sql.SQLSyntaxErrorException: Table 'legal.learningResources' doesn't exist +; bad SQL grammar []; nested exception is java.sql.SQLSyntaxErrorException: Table 'legal.learningResources' doesn't exist] +2025-04-17 11:08:14.422 INFO 9972 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED paused. +2025-04-17 11:08:14.423 INFO 9972 --- [SpringContextShutdownHook] o.s.s.quartz.SchedulerFactoryBean : Shutting down Quartz Scheduler +2025-04-17 11:08:14.424 INFO 9972 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED shutting down. +2025-04-17 11:08:14.424 INFO 9972 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED paused. +2025-04-17 11:08:14.424 INFO 9972 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED shutdown complete. +2025-04-17 11:08:14.424 INFO 9972 --- [SpringContextShutdownHook] o.s.s.concurrent.ThreadPoolTaskExecutor : Shutting down ExecutorService 'applicationTaskExecutor' +2025-04-17 11:08:14.432 INFO 9972 --- [SpringContextShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown initiated... +2025-04-17 11:08:16.685 INFO 10003 --- [restartedMain] com.mingchen.BlogApiApplication : Starting BlogApiApplication on mingchendeMac-mini.local with PID 10003 (/Users/mingchen/code/java/other/legalAid/api/target/classes started by mingchen in /Users/mingchen/code/java/other/legalAid) +2025-04-17 11:08:16.688 DEBUG 10003 --- [restartedMain] com.mingchen.BlogApiApplication : Running with Spring Boot v2.2.7.RELEASE, Spring v5.2.6.RELEASE +2025-04-17 11:08:16.688 INFO 10003 --- [restartedMain] com.mingchen.BlogApiApplication : The following profiles are active: dev +2025-04-17 11:08:16.708 INFO 10003 --- [restartedMain] o.s.b.devtools.restart.ChangeableUrls : The Class-Path manifest attribute in /usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/jaxb-runtime-2.3.1.jar referenced one or more files that do not exist: file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/jaxb-api-2.3.1.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/txw2-2.3.1.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/istack-commons-runtime-3.0.7.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/stax-ex-1.8.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/FastInfoset-1.2.15.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/javax.activation-api-1.2.0.jar +2025-04-17 11:08:16.708 INFO 10003 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : Devtools property defaults active! Set 'spring.devtools.add-properties' to 'false' to disable +2025-04-17 11:08:16.708 INFO 10003 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : For additional web related logging consider setting the 'logging.level.web' property to 'DEBUG' +2025-04-17 11:08:16.951 INFO 10003 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Multiple Spring Data modules found, entering strict repository configuration mode! +2025-04-17 11:08:16.952 INFO 10003 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data Redis repositories in DEFAULT mode. +2025-04-17 11:08:16.971 INFO 10003 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 9ms. Found 0 Redis repository interfaces. +2025-04-17 11:08:17.236 INFO 10003 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 9092 (http) +2025-04-17 11:08:17.239 INFO 10003 --- [restartedMain] o.apache.catalina.core.StandardService : Starting service [Tomcat] +2025-04-17 11:08:17.239 INFO 10003 --- [restartedMain] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.34] +2025-04-17 11:08:17.261 INFO 10003 --- [restartedMain] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext +2025-04-17 11:08:17.262 INFO 10003 --- [restartedMain] o.s.web.context.ContextLoader : Root WebApplicationContext: initialization completed in 553 ms +2025-04-17 11:08:17.755 INFO 10003 --- [restartedMain] n.b.p.u.AbstractUserAgentAnalyzerDirect : - Loaded 90 files in 206 msec using expression: classpath*:UserAgents/**/*.yaml +2025-04-17 11:08:17.755 INFO 10003 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : +2025-04-17 11:08:17.755 INFO 10003 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : /-----------------------------------------------------------\ +2025-04-17 11:08:17.755 INFO 10003 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : | Yauaa 5.20 (v5.20 @ 2020-11-22T15:39:16Z) | +2025-04-17 11:08:17.755 INFO 10003 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : +-----------------------------------------------------------+ +2025-04-17 11:08:17.755 INFO 10003 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : | For more information: https://yauaa.basjes.nl | +2025-04-17 11:08:17.755 INFO 10003 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : | Copyright (C) 2013-2020 Niels Basjes - License Apache 2.0 | +2025-04-17 11:08:17.755 INFO 10003 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : \-----------------------------------------------------------/ +2025-04-17 11:08:17.755 INFO 10003 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : +2025-04-17 11:08:17.761 INFO 10003 --- [restartedMain] n.b.p.u.AbstractUserAgentAnalyzerDirect : Building all needed matchers for the requested 11 fields. +2025-04-17 11:08:17.814 INFO 10003 --- [restartedMain] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor' +2025-04-17 11:08:17.898 INFO 10003 --- [restartedMain] org.quartz.impl.StdSchedulerFactory : Using default implementation for ThreadExecutor +2025-04-17 11:08:17.902 INFO 10003 --- [restartedMain] org.quartz.core.SchedulerSignalerImpl : Initialized Scheduler Signaller of type: class org.quartz.core.SchedulerSignalerImpl +2025-04-17 11:08:17.902 INFO 10003 --- [restartedMain] org.quartz.core.QuartzScheduler : Quartz Scheduler v.2.3.2 created. +2025-04-17 11:08:17.903 INFO 10003 --- [restartedMain] org.quartz.simpl.RAMJobStore : RAMJobStore initialized. +2025-04-17 11:08:17.903 INFO 10003 --- [restartedMain] org.quartz.core.QuartzScheduler : Scheduler meta-data: Quartz Scheduler (v2.3.2) 'quartzScheduler' with instanceId 'NON_CLUSTERED' + Scheduler class: 'org.quartz.core.QuartzScheduler' - running locally. + NOT STARTED. + Currently in standby mode. + Number of jobs executed: 0 + Using thread pool 'org.quartz.simpl.SimpleThreadPool' - with 10 threads. + Using job-store 'org.quartz.simpl.RAMJobStore' - which does not support persistence. and is not clustered. + +2025-04-17 11:08:17.903 INFO 10003 --- [restartedMain] org.quartz.impl.StdSchedulerFactory : Quartz scheduler 'quartzScheduler' initialized from an externally provided properties instance. +2025-04-17 11:08:17.903 INFO 10003 --- [restartedMain] org.quartz.impl.StdSchedulerFactory : Quartz scheduler version: 2.3.2 +2025-04-17 11:08:17.903 INFO 10003 --- [restartedMain] org.quartz.core.QuartzScheduler : JobFactory set to: org.springframework.scheduling.quartz.SpringBeanJobFactory@5a48c046 +2025-04-17 11:08:17.933 INFO 10003 --- [restartedMain] o.s.s.web.DefaultSecurityFilterChain : Creating filter chain: any request, [org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter@680d9fa7, org.springframework.security.web.context.SecurityContextPersistenceFilter@4f321816, org.springframework.security.web.header.HeaderWriterFilter@79be1459, org.springframework.web.filter.CorsFilter@654c908c, org.springframework.security.web.authentication.logout.LogoutFilter@66c7df6e, com.mingchen.common.config.JwtLoginFilter@455f54d3, com.mingchen.common.config.JwtFilter@7f31c2cd, org.springframework.security.web.savedrequest.RequestCacheAwareFilter@72324d6d, org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter@3b27ec73, org.springframework.security.web.authentication.AnonymousAuthenticationFilter@7b459a2b, org.springframework.security.web.session.SessionManagementFilter@4b9d1e81, org.springframework.security.web.access.ExceptionTranslationFilter@59af2583, org.springframework.security.web.access.intercept.FilterSecurityInterceptor@7833aa70] +2025-04-17 11:08:17.944 INFO 10003 --- [restartedMain] o.s.b.d.a.OptionalLiveReloadServer : LiveReload server is running on port 35729 +2025-04-17 11:08:17.952 INFO 10003 --- [restartedMain] o.s.s.quartz.SchedulerFactoryBean : Starting Quartz Scheduler now +2025-04-17 11:08:17.952 INFO 10003 --- [restartedMain] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED started. +2025-04-17 11:08:17.961 INFO 10003 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 9092 (http) with context path '' +2025-04-17 11:08:17.963 INFO 10003 --- [restartedMain] com.mingchen.BlogApiApplication : Started BlogApiApplication in 1.46 seconds (JVM running for 1.721) +2025-04-17 11:08:35.405 INFO 10003 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED paused. +2025-04-17 11:08:35.406 INFO 10003 --- [SpringContextShutdownHook] o.s.s.quartz.SchedulerFactoryBean : Shutting down Quartz Scheduler +2025-04-17 11:08:35.406 INFO 10003 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED shutting down. +2025-04-17 11:08:35.406 INFO 10003 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED paused. +2025-04-17 11:08:35.406 INFO 10003 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED shutdown complete. +2025-04-17 11:08:35.407 INFO 10003 --- [SpringContextShutdownHook] o.s.s.concurrent.ThreadPoolTaskExecutor : Shutting down ExecutorService 'applicationTaskExecutor' +2025-04-17 11:08:37.715 INFO 10023 --- [restartedMain] com.mingchen.BlogApiApplication : Starting BlogApiApplication on mingchendeMac-mini.local with PID 10023 (/Users/mingchen/code/java/other/legalAid/api/target/classes started by mingchen in /Users/mingchen/code/java/other/legalAid) +2025-04-17 11:08:37.717 DEBUG 10023 --- [restartedMain] com.mingchen.BlogApiApplication : Running with Spring Boot v2.2.7.RELEASE, Spring v5.2.6.RELEASE +2025-04-17 11:08:37.717 INFO 10023 --- [restartedMain] com.mingchen.BlogApiApplication : The following profiles are active: dev +2025-04-17 11:08:37.735 INFO 10023 --- [restartedMain] o.s.b.devtools.restart.ChangeableUrls : The Class-Path manifest attribute in /usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/jaxb-runtime-2.3.1.jar referenced one or more files that do not exist: file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/jaxb-api-2.3.1.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/txw2-2.3.1.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/istack-commons-runtime-3.0.7.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/stax-ex-1.8.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/FastInfoset-1.2.15.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/javax.activation-api-1.2.0.jar +2025-04-17 11:08:37.735 INFO 10023 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : Devtools property defaults active! Set 'spring.devtools.add-properties' to 'false' to disable +2025-04-17 11:08:37.735 INFO 10023 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : For additional web related logging consider setting the 'logging.level.web' property to 'DEBUG' +2025-04-17 11:08:37.940 INFO 10023 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Multiple Spring Data modules found, entering strict repository configuration mode! +2025-04-17 11:08:37.941 INFO 10023 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data Redis repositories in DEFAULT mode. +2025-04-17 11:08:37.953 INFO 10023 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 7ms. Found 0 Redis repository interfaces. +2025-04-17 11:08:38.223 INFO 10023 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 9092 (http) +2025-04-17 11:08:38.227 INFO 10023 --- [restartedMain] o.apache.catalina.core.StandardService : Starting service [Tomcat] +2025-04-17 11:08:38.227 INFO 10023 --- [restartedMain] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.34] +2025-04-17 11:08:38.253 INFO 10023 --- [restartedMain] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext +2025-04-17 11:08:38.254 INFO 10023 --- [restartedMain] o.s.web.context.ContextLoader : Root WebApplicationContext: initialization completed in 519 ms +2025-04-17 11:08:38.796 INFO 10023 --- [restartedMain] n.b.p.u.AbstractUserAgentAnalyzerDirect : - Loaded 90 files in 210 msec using expression: classpath*:UserAgents/**/*.yaml +2025-04-17 11:08:38.797 INFO 10023 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : +2025-04-17 11:08:38.797 INFO 10023 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : /-----------------------------------------------------------\ +2025-04-17 11:08:38.797 INFO 10023 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : | Yauaa 5.20 (v5.20 @ 2020-11-22T15:39:16Z) | +2025-04-17 11:08:38.797 INFO 10023 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : +-----------------------------------------------------------+ +2025-04-17 11:08:38.797 INFO 10023 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : | For more information: https://yauaa.basjes.nl | +2025-04-17 11:08:38.797 INFO 10023 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : | Copyright (C) 2013-2020 Niels Basjes - License Apache 2.0 | +2025-04-17 11:08:38.797 INFO 10023 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : \-----------------------------------------------------------/ +2025-04-17 11:08:38.797 INFO 10023 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : +2025-04-17 11:08:38.799 INFO 10023 --- [restartedMain] n.b.p.u.AbstractUserAgentAnalyzerDirect : Building all needed matchers for the requested 11 fields. +2025-04-17 11:08:38.850 INFO 10023 --- [restartedMain] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor' +2025-04-17 11:08:38.930 INFO 10023 --- [restartedMain] org.quartz.impl.StdSchedulerFactory : Using default implementation for ThreadExecutor +2025-04-17 11:08:38.934 INFO 10023 --- [restartedMain] org.quartz.core.SchedulerSignalerImpl : Initialized Scheduler Signaller of type: class org.quartz.core.SchedulerSignalerImpl +2025-04-17 11:08:38.934 INFO 10023 --- [restartedMain] org.quartz.core.QuartzScheduler : Quartz Scheduler v.2.3.2 created. +2025-04-17 11:08:38.934 INFO 10023 --- [restartedMain] org.quartz.simpl.RAMJobStore : RAMJobStore initialized. +2025-04-17 11:08:38.934 INFO 10023 --- [restartedMain] org.quartz.core.QuartzScheduler : Scheduler meta-data: Quartz Scheduler (v2.3.2) 'quartzScheduler' with instanceId 'NON_CLUSTERED' + Scheduler class: 'org.quartz.core.QuartzScheduler' - running locally. + NOT STARTED. + Currently in standby mode. + Number of jobs executed: 0 + Using thread pool 'org.quartz.simpl.SimpleThreadPool' - with 10 threads. + Using job-store 'org.quartz.simpl.RAMJobStore' - which does not support persistence. and is not clustered. + +2025-04-17 11:08:38.934 INFO 10023 --- [restartedMain] org.quartz.impl.StdSchedulerFactory : Quartz scheduler 'quartzScheduler' initialized from an externally provided properties instance. +2025-04-17 11:08:38.934 INFO 10023 --- [restartedMain] org.quartz.impl.StdSchedulerFactory : Quartz scheduler version: 2.3.2 +2025-04-17 11:08:38.934 INFO 10023 --- [restartedMain] org.quartz.core.QuartzScheduler : JobFactory set to: org.springframework.scheduling.quartz.SpringBeanJobFactory@2774e825 +2025-04-17 11:08:38.965 INFO 10023 --- [restartedMain] o.s.s.web.DefaultSecurityFilterChain : Creating filter chain: any request, [org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter@2d94b4af, org.springframework.security.web.context.SecurityContextPersistenceFilter@6bd716bb, org.springframework.security.web.header.HeaderWriterFilter@48b8cb52, org.springframework.web.filter.CorsFilter@35f935b7, org.springframework.security.web.authentication.logout.LogoutFilter@299c41aa, com.mingchen.common.config.JwtLoginFilter@367aa664, com.mingchen.common.config.JwtFilter@2173d2c4, org.springframework.security.web.savedrequest.RequestCacheAwareFilter@620739f5, org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter@64d3b26b, org.springframework.security.web.authentication.AnonymousAuthenticationFilter@29ca2b89, org.springframework.security.web.session.SessionManagementFilter@49748746, org.springframework.security.web.access.ExceptionTranslationFilter@5c5606db, org.springframework.security.web.access.intercept.FilterSecurityInterceptor@210cfaad] +2025-04-17 11:08:38.975 INFO 10023 --- [restartedMain] o.s.b.d.a.OptionalLiveReloadServer : LiveReload server is running on port 35729 +2025-04-17 11:08:38.984 INFO 10023 --- [restartedMain] o.s.s.quartz.SchedulerFactoryBean : Starting Quartz Scheduler now +2025-04-17 11:08:38.984 INFO 10023 --- [restartedMain] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED started. +2025-04-17 11:08:38.993 INFO 10023 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 9092 (http) with context path '' +2025-04-17 11:08:38.995 INFO 10023 --- [restartedMain] com.mingchen.BlogApiApplication : Started BlogApiApplication in 1.462 seconds (JVM running for 1.713) +2025-04-17 11:08:41.645 INFO 10023 --- [http-nio-9092-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet' +2025-04-17 11:08:41.646 INFO 10023 --- [http-nio-9092-exec-1] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet' +2025-04-17 11:08:41.648 INFO 10023 --- [http-nio-9092-exec-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 2 ms +2025-04-17 11:08:43.344 INFO 10023 --- [http-nio-9092-exec-1] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting... +2025-04-17 11:08:44.261 INFO 10023 --- [http-nio-9092-exec-1] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed. +2025-04-17 11:08:44.317 DEBUG 10023 --- [http-nio-9092-exec-1] c.m.m.L.selectList : ==> Preparing: SELECT resource_id,title,type,url,duration,description FROM learning_resources +2025-04-17 11:08:44.433 DEBUG 10023 --- [http-nio-9092-exec-1] c.m.m.L.selectList : ==> Parameters: +2025-04-17 11:08:44.572 DEBUG 10023 --- [http-nio-9092-exec-1] c.m.m.L.selectList : <== Total: 0 +2025-04-17 11:09:13.342 INFO 10023 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED paused. +2025-04-17 11:09:13.343 INFO 10023 --- [SpringContextShutdownHook] o.s.s.quartz.SchedulerFactoryBean : Shutting down Quartz Scheduler +2025-04-17 11:09:13.343 INFO 10023 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED shutting down. +2025-04-17 11:09:13.344 INFO 10023 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED paused. +2025-04-17 11:09:13.344 INFO 10023 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED shutdown complete. +2025-04-17 11:09:13.344 INFO 10023 --- [SpringContextShutdownHook] o.s.s.concurrent.ThreadPoolTaskExecutor : Shutting down ExecutorService 'applicationTaskExecutor' +2025-04-17 11:09:13.350 INFO 10023 --- [SpringContextShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown initiated... +2025-04-17 11:09:13.381 ERROR 10023 --- [http-nio-9092-exec-1] c.m.c.h.ControllerExceptionHandler : Request URL : http://localhost:9092/admin/learningResources/page, Exception : + +org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exceptions.PersistenceException: +### Error querying database. Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection; nested exception is java.sql.SQLException: HikariDataSource HikariDataSource (HikariPool-1) has been closed. +### The error may exist in com/mingchen/mapper/LearningResourcesMapper.java (best guess) +### The error may involve com.mingchen.mapper.LearningResourcesMapper.selectList_mpCount +### The error occurred while executing a query +### Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection; nested exception is java.sql.SQLException: HikariDataSource HikariDataSource (HikariPool-1) has been closed. + at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:96) + at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:441) + at jdk.proxy2/jdk.proxy2.$Proxy85.selectList(Unknown Source) + at org.mybatis.spring.SqlSessionTemplate.selectList(SqlSessionTemplate.java:224) + at com.baomidou.mybatisplus.core.override.MybatisMapperMethod.executeForMany(MybatisMapperMethod.java:164) + at com.baomidou.mybatisplus.core.override.MybatisMapperMethod.execute(MybatisMapperMethod.java:77) + at com.baomidou.mybatisplus.core.override.MybatisMapperProxy$PlainMethodInvoker.invoke(MybatisMapperProxy.java:152) + at com.baomidou.mybatisplus.core.override.MybatisMapperProxy.invoke(MybatisMapperProxy.java:89) + at jdk.proxy3/jdk.proxy3.$Proxy88.selectList(Unknown Source) + at com.baomidou.mybatisplus.core.mapper.BaseMapper.selectPage(BaseMapper.java:348) + at java.base/java.lang.invoke.MethodHandle.invokeWithArguments(MethodHandle.java:732) + at com.baomidou.mybatisplus.core.override.MybatisMapperProxy$DefaultMethodInvoker.invoke(MybatisMapperProxy.java:166) + at com.baomidou.mybatisplus.core.override.MybatisMapperProxy.invoke(MybatisMapperProxy.java:89) + at jdk.proxy3/jdk.proxy3.$Proxy88.selectPage(Unknown Source) + at com.mingchen.service.impl.LearningResourcesServiceImpl.getLearningResources(LearningResourcesServiceImpl.java:42) + at com.mingchen.service.impl.LearningResourcesServiceImpl$$FastClassBySpringCGLIB$$d7671a85.invoke() + at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) + at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:687) + at com.mingchen.service.impl.LearningResourcesServiceImpl$$EnhancerBySpringCGLIB$$31631284.getLearningResources() + at com.mingchen.api.open.LearningResourcesController.getLearningResources(LearningResourcesController.java:31) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:569) + at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:190) + at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:138) + at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:105) + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:879) + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:793) + at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) + at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1040) + at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943) + at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) + at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898) + at javax.servlet.http.HttpServlet.service(HttpServlet.java:503) + at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) + at javax.servlet.http.HttpServlet.service(HttpServlet.java:590) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:320) + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:126) + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:90) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:118) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:137) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:111) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:158) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at com.mingchen.common.config.JwtFilter.doFilter(JwtFilter.java:68) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:200) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:116) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:92) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:92) + at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:77) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:105) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:56) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:215) + at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:178) + at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:358) + at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:271) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202) + at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) + at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541) + at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139) + at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) + at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) + at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) + at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:373) + at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) + at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868) + at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1590) + at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) + at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) + at java.base/java.lang.Thread.run(Thread.java:840) +Caused by: org.apache.ibatis.exceptions.PersistenceException: +### Error querying database. Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection; nested exception is java.sql.SQLException: HikariDataSource HikariDataSource (HikariPool-1) has been closed. +### The error may exist in com/mingchen/mapper/LearningResourcesMapper.java (best guess) +### The error may involve com.mingchen.mapper.LearningResourcesMapper.selectList_mpCount +### The error occurred while executing a query +### Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection; nested exception is java.sql.SQLException: HikariDataSource HikariDataSource (HikariPool-1) has been closed. + at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:30) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:156) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:147) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:142) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:569) + at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:427) + ... 106 common frames omitted +Caused by: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection; nested exception is java.sql.SQLException: HikariDataSource HikariDataSource (HikariPool-1) has been closed. + at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:82) + at org.mybatis.spring.transaction.SpringManagedTransaction.openConnection(SpringManagedTransaction.java:80) + at org.mybatis.spring.transaction.SpringManagedTransaction.getConnection(SpringManagedTransaction.java:67) + at org.apache.ibatis.executor.BaseExecutor.getConnection(BaseExecutor.java:348) + at org.apache.ibatis.executor.SimpleExecutor.prepareStatement(SimpleExecutor.java:89) + at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:64) + at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:336) + at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:158) + at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:110) + at com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor.willDoQuery(PaginationInnerInterceptor.java:141) + at com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor.intercept(MybatisPlusInterceptor.java:75) + at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:59) + at jdk.proxy2/jdk.proxy2.$Proxy112.query(Unknown Source) + at com.github.pagehelper.PageInterceptor.intercept(PageInterceptor.java:108) + at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:59) + at jdk.proxy2/jdk.proxy2.$Proxy112.query(Unknown Source) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:154) + ... 113 common frames omitted +Caused by: java.sql.SQLException: HikariDataSource HikariDataSource (HikariPool-1) has been closed. + at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:96) + at org.springframework.jdbc.datasource.DataSourceUtils.fetchConnection(DataSourceUtils.java:158) + at org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSourceUtils.java:116) + at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:79) + ... 129 common frames omitted + +2025-04-17 11:09:13.395 WARN 10023 --- [http-nio-9092-exec-1] .m.m.a.ExceptionHandlerExceptionResolver : Resolved [org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exceptions.PersistenceException: +### Error querying database. Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection; nested exception is java.sql.SQLException: HikariDataSource HikariDataSource (HikariPool-1) has been closed. +### The error may exist in com/mingchen/mapper/LearningResourcesMapper.java (best guess) +### The error may involve com.mingchen.mapper.LearningResourcesMapper.selectList_mpCount +### The error occurred while executing a query +### Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection; nested exception is java.sql.SQLException: HikariDataSource HikariDataSource (HikariPool-1) has been closed.] +2025-04-17 11:09:13.469 INFO 10023 --- [SpringContextShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown completed. +2025-04-17 11:09:15.576 INFO 10056 --- [restartedMain] com.mingchen.BlogApiApplication : Starting BlogApiApplication on mingchendeMac-mini.local with PID 10056 (/Users/mingchen/code/java/other/legalAid/api/target/classes started by mingchen in /Users/mingchen/code/java/other/legalAid) +2025-04-17 11:09:15.578 DEBUG 10056 --- [restartedMain] com.mingchen.BlogApiApplication : Running with Spring Boot v2.2.7.RELEASE, Spring v5.2.6.RELEASE +2025-04-17 11:09:15.579 INFO 10056 --- [restartedMain] com.mingchen.BlogApiApplication : The following profiles are active: dev +2025-04-17 11:09:15.597 INFO 10056 --- [restartedMain] o.s.b.devtools.restart.ChangeableUrls : The Class-Path manifest attribute in /usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/jaxb-runtime-2.3.1.jar referenced one or more files that do not exist: file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/jaxb-api-2.3.1.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/txw2-2.3.1.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/istack-commons-runtime-3.0.7.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/stax-ex-1.8.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/FastInfoset-1.2.15.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/javax.activation-api-1.2.0.jar +2025-04-17 11:09:15.597 INFO 10056 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : Devtools property defaults active! Set 'spring.devtools.add-properties' to 'false' to disable +2025-04-17 11:09:15.597 INFO 10056 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : For additional web related logging consider setting the 'logging.level.web' property to 'DEBUG' +2025-04-17 11:09:15.810 INFO 10056 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Multiple Spring Data modules found, entering strict repository configuration mode! +2025-04-17 11:09:15.811 INFO 10056 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data Redis repositories in DEFAULT mode. +2025-04-17 11:09:15.826 INFO 10056 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 10ms. Found 0 Redis repository interfaces. +2025-04-17 11:09:16.091 INFO 10056 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 9092 (http) +2025-04-17 11:09:16.094 INFO 10056 --- [restartedMain] o.apache.catalina.core.StandardService : Starting service [Tomcat] +2025-04-17 11:09:16.094 INFO 10056 --- [restartedMain] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.34] +2025-04-17 11:09:16.117 INFO 10056 --- [restartedMain] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext +2025-04-17 11:09:16.118 INFO 10056 --- [restartedMain] o.s.web.context.ContextLoader : Root WebApplicationContext: initialization completed in 521 ms +2025-04-17 11:09:16.618 INFO 10056 --- [restartedMain] n.b.p.u.AbstractUserAgentAnalyzerDirect : - Loaded 90 files in 209 msec using expression: classpath*:UserAgents/**/*.yaml +2025-04-17 11:09:16.618 INFO 10056 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : +2025-04-17 11:09:16.618 INFO 10056 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : /-----------------------------------------------------------\ +2025-04-17 11:09:16.618 INFO 10056 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : | Yauaa 5.20 (v5.20 @ 2020-11-22T15:39:16Z) | +2025-04-17 11:09:16.618 INFO 10056 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : +-----------------------------------------------------------+ +2025-04-17 11:09:16.618 INFO 10056 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : | For more information: https://yauaa.basjes.nl | +2025-04-17 11:09:16.618 INFO 10056 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : | Copyright (C) 2013-2020 Niels Basjes - License Apache 2.0 | +2025-04-17 11:09:16.618 INFO 10056 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : \-----------------------------------------------------------/ +2025-04-17 11:09:16.618 INFO 10056 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : +2025-04-17 11:09:16.621 INFO 10056 --- [restartedMain] n.b.p.u.AbstractUserAgentAnalyzerDirect : Building all needed matchers for the requested 11 fields. +2025-04-17 11:09:16.673 INFO 10056 --- [restartedMain] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor' +2025-04-17 11:09:16.757 INFO 10056 --- [restartedMain] org.quartz.impl.StdSchedulerFactory : Using default implementation for ThreadExecutor +2025-04-17 11:09:16.761 INFO 10056 --- [restartedMain] org.quartz.core.SchedulerSignalerImpl : Initialized Scheduler Signaller of type: class org.quartz.core.SchedulerSignalerImpl +2025-04-17 11:09:16.761 INFO 10056 --- [restartedMain] org.quartz.core.QuartzScheduler : Quartz Scheduler v.2.3.2 created. +2025-04-17 11:09:16.761 INFO 10056 --- [restartedMain] org.quartz.simpl.RAMJobStore : RAMJobStore initialized. +2025-04-17 11:09:16.761 INFO 10056 --- [restartedMain] org.quartz.core.QuartzScheduler : Scheduler meta-data: Quartz Scheduler (v2.3.2) 'quartzScheduler' with instanceId 'NON_CLUSTERED' + Scheduler class: 'org.quartz.core.QuartzScheduler' - running locally. + NOT STARTED. + Currently in standby mode. + Number of jobs executed: 0 + Using thread pool 'org.quartz.simpl.SimpleThreadPool' - with 10 threads. + Using job-store 'org.quartz.simpl.RAMJobStore' - which does not support persistence. and is not clustered. + +2025-04-17 11:09:16.761 INFO 10056 --- [restartedMain] org.quartz.impl.StdSchedulerFactory : Quartz scheduler 'quartzScheduler' initialized from an externally provided properties instance. +2025-04-17 11:09:16.761 INFO 10056 --- [restartedMain] org.quartz.impl.StdSchedulerFactory : Quartz scheduler version: 2.3.2 +2025-04-17 11:09:16.761 INFO 10056 --- [restartedMain] org.quartz.core.QuartzScheduler : JobFactory set to: org.springframework.scheduling.quartz.SpringBeanJobFactory@3a08532d +2025-04-17 11:09:16.790 INFO 10056 --- [restartedMain] o.s.s.web.DefaultSecurityFilterChain : Creating filter chain: any request, [org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter@a5f9661, org.springframework.security.web.context.SecurityContextPersistenceFilter@3e8f75c3, org.springframework.security.web.header.HeaderWriterFilter@6554bcef, org.springframework.web.filter.CorsFilter@a82054, org.springframework.security.web.authentication.logout.LogoutFilter@21f2cfe8, com.mingchen.common.config.JwtLoginFilter@3f4d2d77, com.mingchen.common.config.JwtFilter@47cd2eb5, org.springframework.security.web.savedrequest.RequestCacheAwareFilter@72c135a9, org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter@42455fb5, org.springframework.security.web.authentication.AnonymousAuthenticationFilter@315754b3, org.springframework.security.web.session.SessionManagementFilter@4ad22f60, org.springframework.security.web.access.ExceptionTranslationFilter@6305419e, org.springframework.security.web.access.intercept.FilterSecurityInterceptor@e177c4] +2025-04-17 11:09:16.800 INFO 10056 --- [restartedMain] o.s.b.d.a.OptionalLiveReloadServer : LiveReload server is running on port 35729 +2025-04-17 11:09:16.808 INFO 10056 --- [restartedMain] o.s.s.quartz.SchedulerFactoryBean : Starting Quartz Scheduler now +2025-04-17 11:09:16.808 INFO 10056 --- [restartedMain] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED started. +2025-04-17 11:09:16.817 INFO 10056 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 9092 (http) with context path '' +2025-04-17 11:09:16.819 INFO 10056 --- [restartedMain] com.mingchen.BlogApiApplication : Started BlogApiApplication in 1.424 seconds (JVM running for 1.684) +2025-04-17 11:09:18.722 INFO 10056 --- [http-nio-9092-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet' +2025-04-17 11:09:18.722 INFO 10056 --- [http-nio-9092-exec-1] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet' +2025-04-17 11:09:18.724 INFO 10056 --- [http-nio-9092-exec-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 2 ms +2025-04-17 11:09:24.403 INFO 10056 --- [http-nio-9092-exec-1] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting... +2025-04-17 11:09:25.299 INFO 10056 --- [http-nio-9092-exec-1] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed. +2025-04-17 11:09:25.337 DEBUG 10056 --- [http-nio-9092-exec-1] c.m.m.L.selectById : ==> Preparing: SELECT resource_id,title,type,url,duration,description FROM learning_resources WHERE resource_id=? +2025-04-17 11:09:25.452 DEBUG 10056 --- [http-nio-9092-exec-1] c.m.m.L.selectById : ==> Parameters: 1(Integer) +2025-04-17 11:09:25.623 DEBUG 10056 --- [http-nio-9092-exec-1] c.m.m.L.selectById : <== Total: 0 +2025-04-17 11:11:29.659 WARN 10056 --- [HikariPool-1 housekeeper] com.zaxxer.hikari.pool.HikariPool : HikariPool-1 - Thread starvation or clock leap detected (housekeeper delta=2m4s255ms). +2025-04-17 11:11:29.842 DEBUG 10056 --- [http-nio-9092-exec-1] c.m.m.L.selectList_mpCount : ==> Preparing: SELECT COUNT() FROM learning_resources +2025-04-17 11:11:29.842 DEBUG 10056 --- [http-nio-9092-exec-1] c.m.m.L.selectList_mpCount : ==> Parameters: +2025-04-17 11:11:30.048 ERROR 10056 --- [http-nio-9092-exec-1] c.m.c.h.ControllerExceptionHandler : Request URL : http://localhost:9092/admin/learningResources/page, Exception : + +org.springframework.jdbc.BadSqlGrammarException: +### Error querying database. Cause: java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') FROM learning_resources' at line 1 +### The error may exist in com/mingchen/mapper/LearningResourcesMapper.java (best guess) +### The error may involve defaultParameterMap +### The error occurred while setting parameters +### SQL: SELECT COUNT() FROM learning_resources +### Cause: java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') FROM learning_resources' at line 1 +; bad SQL grammar []; nested exception is java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') FROM learning_resources' at line 1 + at org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.doTranslate(SQLErrorCodeSQLExceptionTranslator.java:235) + at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:72) + at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:91) + at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:441) + at jdk.proxy2/jdk.proxy2.$Proxy85.selectList(Unknown Source) + at org.mybatis.spring.SqlSessionTemplate.selectList(SqlSessionTemplate.java:224) + at com.baomidou.mybatisplus.core.override.MybatisMapperMethod.executeForMany(MybatisMapperMethod.java:164) + at com.baomidou.mybatisplus.core.override.MybatisMapperMethod.execute(MybatisMapperMethod.java:77) + at com.baomidou.mybatisplus.core.override.MybatisMapperProxy$PlainMethodInvoker.invoke(MybatisMapperProxy.java:152) + at com.baomidou.mybatisplus.core.override.MybatisMapperProxy.invoke(MybatisMapperProxy.java:89) + at jdk.proxy3/jdk.proxy3.$Proxy88.selectList(Unknown Source) + at com.baomidou.mybatisplus.core.mapper.BaseMapper.selectPage(BaseMapper.java:348) + at java.base/java.lang.invoke.MethodHandle.invokeWithArguments(MethodHandle.java:732) + at com.baomidou.mybatisplus.core.override.MybatisMapperProxy$DefaultMethodInvoker.invoke(MybatisMapperProxy.java:166) + at com.baomidou.mybatisplus.core.override.MybatisMapperProxy.invoke(MybatisMapperProxy.java:89) + at jdk.proxy3/jdk.proxy3.$Proxy88.selectPage(Unknown Source) + at com.mingchen.service.impl.LearningResourcesServiceImpl.getLearningResources(LearningResourcesServiceImpl.java:42) + at com.mingchen.service.impl.LearningResourcesServiceImpl$$FastClassBySpringCGLIB$$d7671a85.invoke() + at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) + at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:687) + at com.mingchen.service.impl.LearningResourcesServiceImpl$$EnhancerBySpringCGLIB$$2c6e12f4.getLearningResources() + at com.mingchen.api.open.LearningResourcesController.getLearningResources(LearningResourcesController.java:31) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:569) + at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:190) + at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:138) + at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:105) + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:879) + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:793) + at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) + at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1040) + at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943) + at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) + at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898) + at javax.servlet.http.HttpServlet.service(HttpServlet.java:503) + at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) + at javax.servlet.http.HttpServlet.service(HttpServlet.java:590) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:320) + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:126) + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:90) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:118) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:137) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:111) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:158) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at com.mingchen.common.config.JwtFilter.doFilter(JwtFilter.java:68) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:200) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:116) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:92) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:92) + at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:77) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:105) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:56) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:215) + at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:178) + at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:358) + at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:271) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202) + at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) + at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541) + at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139) + at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) + at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) + at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) + at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:373) + at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) + at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868) + at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1590) + at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) + at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) + at java.base/java.lang.Thread.run(Thread.java:840) +Caused by: java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') FROM learning_resources' at line 1 + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:120) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:97) + at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122) + at com.mysql.cj.jdbc.ClientPreparedStatement.executeInternal(ClientPreparedStatement.java:953) + at com.mysql.cj.jdbc.ClientPreparedStatement.execute(ClientPreparedStatement.java:370) + at com.zaxxer.hikari.pool.ProxyPreparedStatement.execute(ProxyPreparedStatement.java:44) + at com.zaxxer.hikari.pool.HikariProxyPreparedStatement.execute(HikariProxyPreparedStatement.java) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:569) + at org.apache.ibatis.logging.jdbc.PreparedStatementLogger.invoke(PreparedStatementLogger.java:58) + at jdk.proxy4/jdk.proxy4.$Proxy114.execute(Unknown Source) + at org.apache.ibatis.executor.statement.PreparedStatementHandler.query(PreparedStatementHandler.java:65) + at org.apache.ibatis.executor.statement.RoutingStatementHandler.query(RoutingStatementHandler.java:80) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:569) + at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:61) + at jdk.proxy2/jdk.proxy2.$Proxy112.query(Unknown Source) + at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:65) + at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:336) + at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:158) + at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:110) + at com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor.willDoQuery(PaginationInnerInterceptor.java:141) + at com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor.intercept(MybatisPlusInterceptor.java:75) + at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:59) + at jdk.proxy2/jdk.proxy2.$Proxy111.query(Unknown Source) + at com.github.pagehelper.PageInterceptor.intercept(PageInterceptor.java:108) + at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:59) + at jdk.proxy2/jdk.proxy2.$Proxy111.query(Unknown Source) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:154) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:147) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:142) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:569) + at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:427) + ... 106 common frames omitted + +2025-04-17 11:11:30.062 WARN 10056 --- [http-nio-9092-exec-1] .m.m.a.ExceptionHandlerExceptionResolver : Resolved [org.springframework.jdbc.BadSqlGrammarException: +### Error querying database. Cause: java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') FROM learning_resources' at line 1 +### The error may exist in com/mingchen/mapper/LearningResourcesMapper.java (best guess) +### The error may involve defaultParameterMap +### The error occurred while setting parameters +### SQL: SELECT COUNT() FROM learning_resources +### Cause: java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') FROM learning_resources' at line 1 +; bad SQL grammar []; nested exception is java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') FROM learning_resources' at line 1] +2025-04-17 11:11:38.403 DEBUG 10056 --- [http-nio-9092-exec-3] c.m.m.L.selectById : ==> Preparing: SELECT resource_id,title,type,url,duration,description FROM learning_resources WHERE resource_id=? +2025-04-17 11:11:38.405 DEBUG 10056 --- [http-nio-9092-exec-3] c.m.m.L.selectById : ==> Parameters: 1(Integer) +2025-04-17 11:11:38.456 DEBUG 10056 --- [http-nio-9092-exec-3] c.m.m.L.selectById : <== Total: 1 +2025-04-17 11:11:47.682 DEBUG 10056 --- [http-nio-9092-exec-3] c.m.m.L.selectList_mpCount : ==> Preparing: SELECT COUNT() FROM learning_resources +2025-04-17 11:11:47.684 DEBUG 10056 --- [http-nio-9092-exec-3] c.m.m.L.selectList_mpCount : ==> Parameters: +2025-04-17 11:11:49.837 ERROR 10056 --- [http-nio-9092-exec-3] c.m.c.h.ControllerExceptionHandler : Request URL : http://localhost:9092/admin/learningResources/page, Exception : + +org.springframework.jdbc.BadSqlGrammarException: +### Error querying database. Cause: java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') FROM learning_resources' at line 1 +### The error may exist in com/mingchen/mapper/LearningResourcesMapper.java (best guess) +### The error may involve defaultParameterMap +### The error occurred while setting parameters +### SQL: SELECT COUNT() FROM learning_resources +### Cause: java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') FROM learning_resources' at line 1 +; bad SQL grammar []; nested exception is java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') FROM learning_resources' at line 1 + at org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.doTranslate(SQLErrorCodeSQLExceptionTranslator.java:235) + at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:72) + at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:91) + at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:441) + at jdk.proxy2/jdk.proxy2.$Proxy85.selectList(Unknown Source) + at org.mybatis.spring.SqlSessionTemplate.selectList(SqlSessionTemplate.java:224) + at com.baomidou.mybatisplus.core.override.MybatisMapperMethod.executeForMany(MybatisMapperMethod.java:164) + at com.baomidou.mybatisplus.core.override.MybatisMapperMethod.execute(MybatisMapperMethod.java:77) + at com.baomidou.mybatisplus.core.override.MybatisMapperProxy$PlainMethodInvoker.invoke(MybatisMapperProxy.java:152) + at com.baomidou.mybatisplus.core.override.MybatisMapperProxy.invoke(MybatisMapperProxy.java:89) + at jdk.proxy3/jdk.proxy3.$Proxy88.selectList(Unknown Source) + at com.baomidou.mybatisplus.core.mapper.BaseMapper.selectPage(BaseMapper.java:348) + at java.base/java.lang.invoke.MethodHandle.invokeWithArguments(MethodHandle.java:732) + at com.baomidou.mybatisplus.core.override.MybatisMapperProxy$DefaultMethodInvoker.invoke(MybatisMapperProxy.java:166) + at com.baomidou.mybatisplus.core.override.MybatisMapperProxy.invoke(MybatisMapperProxy.java:89) + at jdk.proxy3/jdk.proxy3.$Proxy88.selectPage(Unknown Source) + at com.mingchen.service.impl.LearningResourcesServiceImpl.getLearningResources(LearningResourcesServiceImpl.java:42) + at com.mingchen.service.impl.LearningResourcesServiceImpl$$FastClassBySpringCGLIB$$d7671a85.invoke() + at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) + at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:687) + at com.mingchen.service.impl.LearningResourcesServiceImpl$$EnhancerBySpringCGLIB$$2c6e12f4.getLearningResources() + at com.mingchen.api.open.LearningResourcesController.getLearningResources(LearningResourcesController.java:31) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:569) + at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:190) + at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:138) + at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:105) + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:879) + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:793) + at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) + at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1040) + at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943) + at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) + at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898) + at javax.servlet.http.HttpServlet.service(HttpServlet.java:503) + at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) + at javax.servlet.http.HttpServlet.service(HttpServlet.java:590) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:320) + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:126) + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:90) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:118) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:137) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:111) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:158) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at com.mingchen.common.config.JwtFilter.doFilter(JwtFilter.java:68) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:200) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:116) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:92) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:92) + at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:77) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:105) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:56) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:215) + at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:178) + at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:358) + at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:271) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202) + at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) + at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541) + at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139) + at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) + at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) + at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) + at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:373) + at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) + at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868) + at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1590) + at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) + at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) + at java.base/java.lang.Thread.run(Thread.java:840) +Caused by: java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') FROM learning_resources' at line 1 + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:120) + at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:97) + at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122) + at com.mysql.cj.jdbc.ClientPreparedStatement.executeInternal(ClientPreparedStatement.java:953) + at com.mysql.cj.jdbc.ClientPreparedStatement.execute(ClientPreparedStatement.java:370) + at com.zaxxer.hikari.pool.ProxyPreparedStatement.execute(ProxyPreparedStatement.java:44) + at com.zaxxer.hikari.pool.HikariProxyPreparedStatement.execute(HikariProxyPreparedStatement.java) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:569) + at org.apache.ibatis.logging.jdbc.PreparedStatementLogger.invoke(PreparedStatementLogger.java:58) + at jdk.proxy4/jdk.proxy4.$Proxy114.execute(Unknown Source) + at org.apache.ibatis.executor.statement.PreparedStatementHandler.query(PreparedStatementHandler.java:65) + at org.apache.ibatis.executor.statement.RoutingStatementHandler.query(RoutingStatementHandler.java:80) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:569) + at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:61) + at jdk.proxy2/jdk.proxy2.$Proxy112.query(Unknown Source) + at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:65) + at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:336) + at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:158) + at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:110) + at com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor.willDoQuery(PaginationInnerInterceptor.java:141) + at com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor.intercept(MybatisPlusInterceptor.java:75) + at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:59) + at jdk.proxy2/jdk.proxy2.$Proxy111.query(Unknown Source) + at com.github.pagehelper.PageInterceptor.intercept(PageInterceptor.java:108) + at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:59) + at jdk.proxy2/jdk.proxy2.$Proxy111.query(Unknown Source) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:154) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:147) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:142) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:569) + at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:427) + ... 106 common frames omitted + +2025-04-17 11:11:49.839 WARN 10056 --- [http-nio-9092-exec-3] .m.m.a.ExceptionHandlerExceptionResolver : Resolved [org.springframework.jdbc.BadSqlGrammarException: +### Error querying database. Cause: java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') FROM learning_resources' at line 1 +### The error may exist in com/mingchen/mapper/LearningResourcesMapper.java (best guess) +### The error may involve defaultParameterMap +### The error occurred while setting parameters +### SQL: SELECT COUNT() FROM learning_resources +### Cause: java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') FROM learning_resources' at line 1 +; bad SQL grammar []; nested exception is java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') FROM learning_resources' at line 1] +2025-04-17 11:15:56.823 INFO 10056 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED paused. +2025-04-17 11:15:56.824 INFO 10056 --- [SpringContextShutdownHook] o.s.s.quartz.SchedulerFactoryBean : Shutting down Quartz Scheduler +2025-04-17 11:15:56.824 INFO 10056 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED shutting down. +2025-04-17 11:15:56.824 INFO 10056 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED paused. +2025-04-17 11:15:56.824 INFO 10056 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED shutdown complete. +2025-04-17 11:15:56.825 INFO 10056 --- [SpringContextShutdownHook] o.s.s.concurrent.ThreadPoolTaskExecutor : Shutting down ExecutorService 'applicationTaskExecutor' +2025-04-17 11:15:56.831 INFO 10056 --- [SpringContextShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown initiated... +2025-04-17 11:15:56.834 INFO 10056 --- [SpringContextShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown completed. +2025-04-17 11:15:59.522 INFO 10397 --- [restartedMain] com.mingchen.BlogApiApplication : Starting BlogApiApplication on mingchendeMac-mini.local with PID 10397 (/Users/mingchen/code/java/other/legalAid/api/target/classes started by mingchen in /Users/mingchen/code/java/other/legalAid) +2025-04-17 11:15:59.524 DEBUG 10397 --- [restartedMain] com.mingchen.BlogApiApplication : Running with Spring Boot v2.2.7.RELEASE, Spring v5.2.6.RELEASE +2025-04-17 11:15:59.524 INFO 10397 --- [restartedMain] com.mingchen.BlogApiApplication : The following profiles are active: dev +2025-04-17 11:15:59.543 INFO 10397 --- [restartedMain] o.s.b.devtools.restart.ChangeableUrls : The Class-Path manifest attribute in /usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/jaxb-runtime-2.3.1.jar referenced one or more files that do not exist: file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/jaxb-api-2.3.1.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/txw2-2.3.1.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/istack-commons-runtime-3.0.7.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/stax-ex-1.8.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/FastInfoset-1.2.15.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/javax.activation-api-1.2.0.jar +2025-04-17 11:15:59.543 INFO 10397 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : Devtools property defaults active! Set 'spring.devtools.add-properties' to 'false' to disable +2025-04-17 11:15:59.543 INFO 10397 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : For additional web related logging consider setting the 'logging.level.web' property to 'DEBUG' +2025-04-17 11:15:59.763 INFO 10397 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Multiple Spring Data modules found, entering strict repository configuration mode! +2025-04-17 11:15:59.764 INFO 10397 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data Redis repositories in DEFAULT mode. +2025-04-17 11:15:59.777 INFO 10397 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 7ms. Found 0 Redis repository interfaces. +2025-04-17 11:16:00.029 INFO 10397 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 9092 (http) +2025-04-17 11:16:00.032 INFO 10397 --- [restartedMain] o.apache.catalina.core.StandardService : Starting service [Tomcat] +2025-04-17 11:16:00.032 INFO 10397 --- [restartedMain] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.34] +2025-04-17 11:16:00.054 INFO 10397 --- [restartedMain] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext +2025-04-17 11:16:00.054 INFO 10397 --- [restartedMain] o.s.web.context.ContextLoader : Root WebApplicationContext: initialization completed in 510 ms +2025-04-17 11:16:00.560 INFO 10397 --- [restartedMain] n.b.p.u.AbstractUserAgentAnalyzerDirect : - Loaded 90 files in 215 msec using expression: classpath*:UserAgents/**/*.yaml +2025-04-17 11:16:00.560 INFO 10397 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : +2025-04-17 11:16:00.560 INFO 10397 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : /-----------------------------------------------------------\ +2025-04-17 11:16:00.560 INFO 10397 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : | Yauaa 5.20 (v5.20 @ 2020-11-22T15:39:16Z) | +2025-04-17 11:16:00.560 INFO 10397 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : +-----------------------------------------------------------+ +2025-04-17 11:16:00.560 INFO 10397 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : | For more information: https://yauaa.basjes.nl | +2025-04-17 11:16:00.560 INFO 10397 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : | Copyright (C) 2013-2020 Niels Basjes - License Apache 2.0 | +2025-04-17 11:16:00.560 INFO 10397 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : \-----------------------------------------------------------/ +2025-04-17 11:16:00.560 INFO 10397 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : +2025-04-17 11:16:00.565 INFO 10397 --- [restartedMain] n.b.p.u.AbstractUserAgentAnalyzerDirect : Building all needed matchers for the requested 11 fields. +2025-04-17 11:16:00.625 INFO 10397 --- [restartedMain] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor' +2025-04-17 11:16:00.712 INFO 10397 --- [restartedMain] org.quartz.impl.StdSchedulerFactory : Using default implementation for ThreadExecutor +2025-04-17 11:16:00.716 INFO 10397 --- [restartedMain] org.quartz.core.SchedulerSignalerImpl : Initialized Scheduler Signaller of type: class org.quartz.core.SchedulerSignalerImpl +2025-04-17 11:16:00.716 INFO 10397 --- [restartedMain] org.quartz.core.QuartzScheduler : Quartz Scheduler v.2.3.2 created. +2025-04-17 11:16:00.716 INFO 10397 --- [restartedMain] org.quartz.simpl.RAMJobStore : RAMJobStore initialized. +2025-04-17 11:16:00.716 INFO 10397 --- [restartedMain] org.quartz.core.QuartzScheduler : Scheduler meta-data: Quartz Scheduler (v2.3.2) 'quartzScheduler' with instanceId 'NON_CLUSTERED' + Scheduler class: 'org.quartz.core.QuartzScheduler' - running locally. + NOT STARTED. + Currently in standby mode. + Number of jobs executed: 0 + Using thread pool 'org.quartz.simpl.SimpleThreadPool' - with 10 threads. + Using job-store 'org.quartz.simpl.RAMJobStore' - which does not support persistence. and is not clustered. + +2025-04-17 11:16:00.717 INFO 10397 --- [restartedMain] org.quartz.impl.StdSchedulerFactory : Quartz scheduler 'quartzScheduler' initialized from an externally provided properties instance. +2025-04-17 11:16:00.717 INFO 10397 --- [restartedMain] org.quartz.impl.StdSchedulerFactory : Quartz scheduler version: 2.3.2 +2025-04-17 11:16:00.717 INFO 10397 --- [restartedMain] org.quartz.core.QuartzScheduler : JobFactory set to: org.springframework.scheduling.quartz.SpringBeanJobFactory@2cc7b8ec +2025-04-17 11:16:00.751 INFO 10397 --- [restartedMain] o.s.s.web.DefaultSecurityFilterChain : Creating filter chain: any request, [org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter@2cade4cd, org.springframework.security.web.context.SecurityContextPersistenceFilter@6ea952d1, org.springframework.security.web.header.HeaderWriterFilter@2a401f72, org.springframework.web.filter.CorsFilter@497e05e0, org.springframework.security.web.authentication.logout.LogoutFilter@7d01c074, com.mingchen.common.config.JwtLoginFilter@142f5254, com.mingchen.common.config.JwtFilter@4f0f0ce5, org.springframework.security.web.savedrequest.RequestCacheAwareFilter@13fb2cb, org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter@70ef464a, org.springframework.security.web.authentication.AnonymousAuthenticationFilter@c470245, org.springframework.security.web.session.SessionManagementFilter@34d8e157, org.springframework.security.web.access.ExceptionTranslationFilter@dd16f5f, org.springframework.security.web.access.intercept.FilterSecurityInterceptor@6fa2c899] +2025-04-17 11:16:00.764 INFO 10397 --- [restartedMain] o.s.b.d.a.OptionalLiveReloadServer : LiveReload server is running on port 35729 +2025-04-17 11:16:00.775 INFO 10397 --- [restartedMain] o.s.s.quartz.SchedulerFactoryBean : Starting Quartz Scheduler now +2025-04-17 11:16:00.775 INFO 10397 --- [restartedMain] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED started. +2025-04-17 11:16:00.787 INFO 10397 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 9092 (http) with context path '' +2025-04-17 11:16:00.790 INFO 10397 --- [restartedMain] com.mingchen.BlogApiApplication : Started BlogApiApplication in 1.457 seconds (JVM running for 1.768) +2025-04-17 11:16:04.428 INFO 10397 --- [http-nio-9092-exec-2] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet' +2025-04-17 11:16:04.428 INFO 10397 --- [http-nio-9092-exec-2] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet' +2025-04-17 11:16:04.430 INFO 10397 --- [http-nio-9092-exec-2] o.s.web.servlet.DispatcherServlet : Completed initialization in 2 ms +2025-04-17 11:16:04.482 INFO 10397 --- [http-nio-9092-exec-2] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting... +2025-04-17 11:16:04.971 INFO 10397 --- [http-nio-9092-exec-2] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed. +2025-04-17 11:16:04.982 DEBUG 10397 --- [http-nio-9092-exec-2] c.m.m.L.selectList : ==> Preparing: SELECT resource_id,title,type,url,duration,description FROM learning_resources +2025-04-17 11:16:05.006 DEBUG 10397 --- [http-nio-9092-exec-2] c.m.m.L.selectList : ==> Parameters: +2025-04-17 11:16:05.070 DEBUG 10397 --- [http-nio-9092-exec-2] c.m.m.L.selectList : <== Total: 5 +2025-04-17 11:25:17.199 INFO 10397 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED paused. +2025-04-17 11:25:17.201 INFO 10397 --- [SpringContextShutdownHook] o.s.s.quartz.SchedulerFactoryBean : Shutting down Quartz Scheduler +2025-04-17 11:25:17.201 INFO 10397 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED shutting down. +2025-04-17 11:25:17.201 INFO 10397 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED paused. +2025-04-17 11:25:17.201 INFO 10397 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED shutdown complete. +2025-04-17 11:25:17.201 INFO 10397 --- [SpringContextShutdownHook] o.s.s.concurrent.ThreadPoolTaskExecutor : Shutting down ExecutorService 'applicationTaskExecutor' +2025-04-17 11:25:17.208 INFO 10397 --- [SpringContextShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown initiated... +2025-04-17 11:25:17.210 INFO 10397 --- [SpringContextShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown completed. +2025-04-17 11:25:19.588 INFO 10909 --- [restartedMain] com.mingchen.BlogApiApplication : Starting BlogApiApplication on mingchendeMac-mini.local with PID 10909 (/Users/mingchen/code/java/other/legalAid/api/target/classes started by mingchen in /Users/mingchen/code/java/other/legalAid) +2025-04-17 11:25:19.589 DEBUG 10909 --- [restartedMain] com.mingchen.BlogApiApplication : Running with Spring Boot v2.2.7.RELEASE, Spring v5.2.6.RELEASE +2025-04-17 11:25:19.589 INFO 10909 --- [restartedMain] com.mingchen.BlogApiApplication : The following profiles are active: dev +2025-04-17 11:25:19.604 INFO 10909 --- [restartedMain] o.s.b.devtools.restart.ChangeableUrls : The Class-Path manifest attribute in /usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/jaxb-runtime-2.3.1.jar referenced one or more files that do not exist: file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/jaxb-api-2.3.1.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/txw2-2.3.1.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/istack-commons-runtime-3.0.7.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/stax-ex-1.8.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/FastInfoset-1.2.15.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/javax.activation-api-1.2.0.jar +2025-04-17 11:25:19.605 INFO 10909 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : Devtools property defaults active! Set 'spring.devtools.add-properties' to 'false' to disable +2025-04-17 11:25:19.605 INFO 10909 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : For additional web related logging consider setting the 'logging.level.web' property to 'DEBUG' +2025-04-17 11:25:19.813 INFO 10909 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Multiple Spring Data modules found, entering strict repository configuration mode! +2025-04-17 11:25:19.814 INFO 10909 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data Redis repositories in DEFAULT mode. +2025-04-17 11:25:19.825 INFO 10909 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 7ms. Found 0 Redis repository interfaces. +2025-04-17 11:25:20.067 INFO 10909 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 9092 (http) +2025-04-17 11:25:20.070 INFO 10909 --- [restartedMain] o.apache.catalina.core.StandardService : Starting service [Tomcat] +2025-04-17 11:25:20.070 INFO 10909 --- [restartedMain] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.34] +2025-04-17 11:25:20.092 INFO 10909 --- [restartedMain] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext +2025-04-17 11:25:20.092 INFO 10909 --- [restartedMain] o.s.web.context.ContextLoader : Root WebApplicationContext: initialization completed in 487 ms +2025-04-17 11:25:20.587 INFO 10909 --- [restartedMain] n.b.p.u.AbstractUserAgentAnalyzerDirect : - Loaded 90 files in 206 msec using expression: classpath*:UserAgents/**/*.yaml +2025-04-17 11:25:20.588 INFO 10909 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : +2025-04-17 11:25:20.588 INFO 10909 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : /-----------------------------------------------------------\ +2025-04-17 11:25:20.588 INFO 10909 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : | Yauaa 5.20 (v5.20 @ 2020-11-22T15:39:16Z) | +2025-04-17 11:25:20.588 INFO 10909 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : +-----------------------------------------------------------+ +2025-04-17 11:25:20.588 INFO 10909 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : | For more information: https://yauaa.basjes.nl | +2025-04-17 11:25:20.588 INFO 10909 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : | Copyright (C) 2013-2020 Niels Basjes - License Apache 2.0 | +2025-04-17 11:25:20.588 INFO 10909 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : \-----------------------------------------------------------/ +2025-04-17 11:25:20.588 INFO 10909 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : +2025-04-17 11:25:20.591 INFO 10909 --- [restartedMain] n.b.p.u.AbstractUserAgentAnalyzerDirect : Building all needed matchers for the requested 11 fields. +2025-04-17 11:25:20.648 INFO 10909 --- [restartedMain] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor' +2025-04-17 11:25:20.755 INFO 10909 --- [restartedMain] org.quartz.impl.StdSchedulerFactory : Using default implementation for ThreadExecutor +2025-04-17 11:25:20.759 INFO 10909 --- [restartedMain] org.quartz.core.SchedulerSignalerImpl : Initialized Scheduler Signaller of type: class org.quartz.core.SchedulerSignalerImpl +2025-04-17 11:25:20.759 INFO 10909 --- [restartedMain] org.quartz.core.QuartzScheduler : Quartz Scheduler v.2.3.2 created. +2025-04-17 11:25:20.759 INFO 10909 --- [restartedMain] org.quartz.simpl.RAMJobStore : RAMJobStore initialized. +2025-04-17 11:25:20.760 INFO 10909 --- [restartedMain] org.quartz.core.QuartzScheduler : Scheduler meta-data: Quartz Scheduler (v2.3.2) 'quartzScheduler' with instanceId 'NON_CLUSTERED' + Scheduler class: 'org.quartz.core.QuartzScheduler' - running locally. + NOT STARTED. + Currently in standby mode. + Number of jobs executed: 0 + Using thread pool 'org.quartz.simpl.SimpleThreadPool' - with 10 threads. + Using job-store 'org.quartz.simpl.RAMJobStore' - which does not support persistence. and is not clustered. + +2025-04-17 11:25:20.760 INFO 10909 --- [restartedMain] org.quartz.impl.StdSchedulerFactory : Quartz scheduler 'quartzScheduler' initialized from an externally provided properties instance. +2025-04-17 11:25:20.760 INFO 10909 --- [restartedMain] org.quartz.impl.StdSchedulerFactory : Quartz scheduler version: 2.3.2 +2025-04-17 11:25:20.760 INFO 10909 --- [restartedMain] org.quartz.core.QuartzScheduler : JobFactory set to: org.springframework.scheduling.quartz.SpringBeanJobFactory@40f29c04 +2025-04-17 11:25:20.795 INFO 10909 --- [restartedMain] o.s.s.web.DefaultSecurityFilterChain : Creating filter chain: any request, [org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter@7b5a7640, org.springframework.security.web.context.SecurityContextPersistenceFilter@7f6f77b5, org.springframework.security.web.header.HeaderWriterFilter@7edc5a0c, org.springframework.web.filter.CorsFilter@6d5e42a1, org.springframework.security.web.authentication.logout.LogoutFilter@75937e94, com.mingchen.common.config.JwtLoginFilter@23af6c18, com.mingchen.common.config.JwtFilter@651fdafb, org.springframework.security.web.savedrequest.RequestCacheAwareFilter@4827c0d7, org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter@4966bb8f, org.springframework.security.web.authentication.AnonymousAuthenticationFilter@4d5f586e, org.springframework.security.web.session.SessionManagementFilter@3ba84e44, org.springframework.security.web.access.ExceptionTranslationFilter@12de03, org.springframework.security.web.access.intercept.FilterSecurityInterceptor@5056a874] +2025-04-17 11:25:20.811 INFO 10909 --- [restartedMain] o.s.b.d.a.OptionalLiveReloadServer : LiveReload server is running on port 35729 +2025-04-17 11:25:20.822 INFO 10909 --- [restartedMain] o.s.s.quartz.SchedulerFactoryBean : Starting Quartz Scheduler now +2025-04-17 11:25:20.822 INFO 10909 --- [restartedMain] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED started. +2025-04-17 11:25:20.833 INFO 10909 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 9092 (http) with context path '' +2025-04-17 11:25:20.835 INFO 10909 --- [restartedMain] com.mingchen.BlogApiApplication : Started BlogApiApplication in 1.392 seconds (JVM running for 1.626) +2025-04-17 11:25:24.881 INFO 10909 --- [http-nio-9092-exec-3] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet' +2025-04-17 11:25:24.881 INFO 10909 --- [http-nio-9092-exec-3] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet' +2025-04-17 11:25:24.884 INFO 10909 --- [http-nio-9092-exec-3] o.s.web.servlet.DispatcherServlet : Completed initialization in 3 ms +2025-04-17 11:25:24.962 INFO 10909 --- [http-nio-9092-exec-3] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting... +2025-04-17 11:25:25.560 INFO 10909 --- [http-nio-9092-exec-3] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed. +2025-04-17 11:25:25.571 DEBUG 10909 --- [http-nio-9092-exec-3] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM learning_resources +2025-04-17 11:25:25.594 DEBUG 10909 --- [http-nio-9092-exec-3] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 11:25:25.661 DEBUG 10909 --- [http-nio-9092-exec-3] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 11:25:25.665 DEBUG 10909 --- [http-nio-9092-exec-3] c.m.m.L.selectList : ==> Preparing: SELECT resource_id,title,type,url,duration,description FROM learning_resources LIMIT ? +2025-04-17 11:25:25.665 DEBUG 10909 --- [http-nio-9092-exec-3] c.m.m.L.selectList : ==> Parameters: 1(Integer) +2025-04-17 11:25:25.724 DEBUG 10909 --- [http-nio-9092-exec-3] c.m.m.L.selectList : <== Total: 1 +2025-04-17 11:25:42.416 DEBUG 10909 --- [http-nio-9092-exec-2] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM learning_resources +2025-04-17 11:25:42.417 DEBUG 10909 --- [http-nio-9092-exec-2] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 11:25:42.459 DEBUG 10909 --- [http-nio-9092-exec-2] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 11:25:42.460 DEBUG 10909 --- [http-nio-9092-exec-2] c.m.m.L.selectList : ==> Preparing: SELECT resource_id,title,type,url,duration,description FROM learning_resources LIMIT ? +2025-04-17 11:25:42.461 DEBUG 10909 --- [http-nio-9092-exec-2] c.m.m.L.selectList : ==> Parameters: 2(Integer) +2025-04-17 11:25:42.495 DEBUG 10909 --- [http-nio-9092-exec-2] c.m.m.L.selectList : <== Total: 2 +2025-04-17 11:25:49.656 DEBUG 10909 --- [http-nio-9092-exec-4] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM learning_resources +2025-04-17 11:25:49.656 DEBUG 10909 --- [http-nio-9092-exec-4] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 11:25:49.696 DEBUG 10909 --- [http-nio-9092-exec-4] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 11:25:49.697 DEBUG 10909 --- [http-nio-9092-exec-4] c.m.m.L.selectList : ==> Preparing: SELECT resource_id,title,type,url,duration,description FROM learning_resources LIMIT ?, ? +2025-04-17 11:25:49.697 DEBUG 10909 --- [http-nio-9092-exec-4] c.m.m.L.selectList : ==> Parameters: 2(Integer), 2(Integer) +2025-04-17 11:25:49.736 DEBUG 10909 --- [http-nio-9092-exec-4] c.m.m.L.selectList : <== Total: 2 +2025-04-17 11:42:31.313 WARN 10909 --- [HikariPool-1 housekeeper] com.zaxxer.hikari.pool.HikariPool : HikariPool-1 - Thread starvation or clock leap detected (housekeeper delta=12m35s624ms). +2025-04-17 11:59:52.251 WARN 10909 --- [HikariPool-1 housekeeper] com.zaxxer.hikari.pool.HikariPool : HikariPool-1 - Thread starvation or clock leap detected (housekeeper delta=15m50s930ms). +2025-04-17 12:17:44.895 WARN 10909 --- [HikariPool-1 housekeeper] com.zaxxer.hikari.pool.HikariPool : HikariPool-1 - Thread starvation or clock leap detected (housekeeper delta=17m52s644ms). +2025-04-17 12:35:01.550 WARN 10909 --- [HikariPool-1 housekeeper] com.zaxxer.hikari.pool.HikariPool : HikariPool-1 - Thread starvation or clock leap detected (housekeeper delta=16m46s654ms). +2025-04-17 12:52:36.211 WARN 10909 --- [HikariPool-1 housekeeper] com.zaxxer.hikari.pool.HikariPool : HikariPool-1 - Thread starvation or clock leap detected (housekeeper delta=17m34s661ms). +2025-04-17 13:01:28.254 WARN 10909 --- [HikariPool-1 housekeeper] com.zaxxer.hikari.pool.HikariPool : HikariPool-1 - Thread starvation or clock leap detected (housekeeper delta=8m22s40ms). +2025-04-17 13:02:35.524 WARN 10909 --- [http-nio-9092-exec-7] com.zaxxer.hikari.pool.PoolBase : HikariPool-1 - Failed to validate connection com.mysql.cj.jdbc.ConnectionImpl@6b1f8639 (No operations allowed after connection closed.). Possibly consider using a shorter maxLifetime value. +2025-04-17 13:02:35.525 WARN 10909 --- [http-nio-9092-exec-7] com.zaxxer.hikari.pool.PoolBase : HikariPool-1 - Failed to validate connection com.mysql.cj.jdbc.ConnectionImpl@45868924 (No operations allowed after connection closed.). Possibly consider using a shorter maxLifetime value. +2025-04-17 13:02:35.526 WARN 10909 --- [http-nio-9092-exec-7] com.zaxxer.hikari.pool.PoolBase : HikariPool-1 - Failed to validate connection com.mysql.cj.jdbc.ConnectionImpl@523fe1e3 (No operations allowed after connection closed.). Possibly consider using a shorter maxLifetime value. +2025-04-17 13:02:35.527 WARN 10909 --- [http-nio-9092-exec-7] com.zaxxer.hikari.pool.PoolBase : HikariPool-1 - Failed to validate connection com.mysql.cj.jdbc.ConnectionImpl@fdd2f6c (No operations allowed after connection closed.). Possibly consider using a shorter maxLifetime value. +2025-04-17 13:02:35.527 WARN 10909 --- [http-nio-9092-exec-7] com.zaxxer.hikari.pool.PoolBase : HikariPool-1 - Failed to validate connection com.mysql.cj.jdbc.ConnectionImpl@aa20b60 (No operations allowed after connection closed.). Possibly consider using a shorter maxLifetime value. +2025-04-17 13:02:35.528 WARN 10909 --- [http-nio-9092-exec-7] com.zaxxer.hikari.pool.PoolBase : HikariPool-1 - Failed to validate connection com.mysql.cj.jdbc.ConnectionImpl@7b1c7cb9 (No operations allowed after connection closed.). Possibly consider using a shorter maxLifetime value. +2025-04-17 13:02:35.528 WARN 10909 --- [http-nio-9092-exec-7] com.zaxxer.hikari.pool.PoolBase : HikariPool-1 - Failed to validate connection com.mysql.cj.jdbc.ConnectionImpl@5601aac0 (No operations allowed after connection closed.). Possibly consider using a shorter maxLifetime value. +2025-04-17 13:02:35.529 WARN 10909 --- [http-nio-9092-exec-7] com.zaxxer.hikari.pool.PoolBase : HikariPool-1 - Failed to validate connection com.mysql.cj.jdbc.ConnectionImpl@30c15923 (No operations allowed after connection closed.). Possibly consider using a shorter maxLifetime value. +2025-04-17 13:02:35.530 WARN 10909 --- [http-nio-9092-exec-7] com.zaxxer.hikari.pool.PoolBase : HikariPool-1 - Failed to validate connection com.mysql.cj.jdbc.ConnectionImpl@2aa2bd50 (No operations allowed after connection closed.). Possibly consider using a shorter maxLifetime value. +2025-04-17 13:02:35.530 WARN 10909 --- [http-nio-9092-exec-7] com.zaxxer.hikari.pool.PoolBase : HikariPool-1 - Failed to validate connection com.mysql.cj.jdbc.ConnectionImpl@3243f509 (No operations allowed after connection closed.). Possibly consider using a shorter maxLifetime value. +2025-04-17 13:02:35.894 DEBUG 10909 --- [http-nio-9092-exec-7] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM learning_resources +2025-04-17 13:02:35.895 DEBUG 10909 --- [http-nio-9092-exec-7] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 13:02:35.947 DEBUG 10909 --- [http-nio-9092-exec-7] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 13:02:35.948 DEBUG 10909 --- [http-nio-9092-exec-7] c.m.m.L.selectList : ==> Preparing: SELECT resource_id,title,type,url,duration,description FROM learning_resources LIMIT ?, ? +2025-04-17 13:02:35.948 DEBUG 10909 --- [http-nio-9092-exec-7] c.m.m.L.selectList : ==> Parameters: 2(Integer), 2(Integer) +2025-04-17 13:02:35.982 DEBUG 10909 --- [http-nio-9092-exec-7] c.m.m.L.selectList : <== Total: 2 +2025-04-17 13:02:44.780 DEBUG 10909 --- [http-nio-9092-exec-8] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM learning_resources +2025-04-17 13:02:44.781 DEBUG 10909 --- [http-nio-9092-exec-8] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 13:02:44.821 DEBUG 10909 --- [http-nio-9092-exec-8] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 13:02:44.822 DEBUG 10909 --- [http-nio-9092-exec-8] c.m.m.L.selectList : ==> Preparing: SELECT resource_id,title,type,url,duration,description FROM learning_resources LIMIT ?, ? +2025-04-17 13:02:44.822 DEBUG 10909 --- [http-nio-9092-exec-8] c.m.m.L.selectList : ==> Parameters: 4(Integer), 2(Integer) +2025-04-17 13:02:44.868 DEBUG 10909 --- [http-nio-9092-exec-8] c.m.m.L.selectList : <== Total: 1 +2025-04-17 13:02:49.240 DEBUG 10909 --- [http-nio-9092-exec-9] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM learning_resources +2025-04-17 13:02:49.241 DEBUG 10909 --- [http-nio-9092-exec-9] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 13:02:49.283 DEBUG 10909 --- [http-nio-9092-exec-9] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 13:02:49.284 DEBUG 10909 --- [http-nio-9092-exec-9] c.m.m.L.selectList : ==> Preparing: SELECT resource_id,title,type,url,duration,description FROM learning_resources LIMIT ?, ? +2025-04-17 13:02:49.284 DEBUG 10909 --- [http-nio-9092-exec-9] c.m.m.L.selectList : ==> Parameters: 4(Integer), 2(Integer) +2025-04-17 13:02:49.325 DEBUG 10909 --- [http-nio-9092-exec-9] c.m.m.L.selectList : <== Total: 1 +2025-04-17 13:02:50.981 DEBUG 10909 --- [http-nio-9092-exec-10] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM learning_resources +2025-04-17 13:02:50.981 DEBUG 10909 --- [http-nio-9092-exec-10] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 13:02:51.021 DEBUG 10909 --- [http-nio-9092-exec-10] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 13:02:51.022 DEBUG 10909 --- [http-nio-9092-exec-10] c.m.m.L.selectList : ==> Preparing: SELECT resource_id,title,type,url,duration,description FROM learning_resources LIMIT ?, ? +2025-04-17 13:02:51.022 DEBUG 10909 --- [http-nio-9092-exec-10] c.m.m.L.selectList : ==> Parameters: 4(Integer), 2(Integer) +2025-04-17 13:02:51.062 DEBUG 10909 --- [http-nio-9092-exec-10] c.m.m.L.selectList : <== Total: 1 +2025-04-17 13:02:55.540 DEBUG 10909 --- [http-nio-9092-exec-1] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM learning_resources +2025-04-17 13:02:55.540 DEBUG 10909 --- [http-nio-9092-exec-1] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 13:02:55.582 DEBUG 10909 --- [http-nio-9092-exec-1] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 13:02:55.582 DEBUG 10909 --- [http-nio-9092-exec-1] c.m.m.L.selectList : ==> Preparing: SELECT resource_id,title,type,url,duration,description FROM learning_resources LIMIT ?, ? +2025-04-17 13:02:55.583 DEBUG 10909 --- [http-nio-9092-exec-1] c.m.m.L.selectList : ==> Parameters: 4(Integer), 2(Integer) +2025-04-17 13:02:55.622 DEBUG 10909 --- [http-nio-9092-exec-1] c.m.m.L.selectList : <== Total: 1 +2025-04-17 13:06:38.910 DEBUG 10909 --- [http-nio-9092-exec-4] c.m.m.C.getAllCategoriesWithLaws : ==> Preparing: SELECT c.category_id, c.name, c.description, l.law_id, l.category_id AS law_category_id, l.title, l.summary, l.content, l.effective_date, l.reference_url FROM categories c LEFT JOIN laws l ON c.category_id = l.category_id ORDER BY c.category_id, l.law_id +2025-04-17 13:06:38.911 DEBUG 10909 --- [http-nio-9092-exec-4] c.m.m.C.getAllCategoriesWithLaws : ==> Parameters: +2025-04-17 13:06:38.958 DEBUG 10909 --- [http-nio-9092-exec-4] c.m.m.C.getAllCategoriesWithLaws : <== Total: 5 +2025-04-17 13:07:28.446 DEBUG 10909 --- [http-nio-9092-exec-5] c.m.m.C.getAllCategoriesWithLaws : ==> Preparing: SELECT c.category_id, c.name, c.description, l.law_id, l.category_id AS law_category_id, l.title, l.summary, l.content, l.effective_date, l.reference_url FROM categories c LEFT JOIN laws l ON c.category_id = l.category_id ORDER BY c.category_id, l.law_id +2025-04-17 13:07:28.446 DEBUG 10909 --- [http-nio-9092-exec-5] c.m.m.C.getAllCategoriesWithLaws : ==> Parameters: +2025-04-17 13:07:28.494 DEBUG 10909 --- [http-nio-9092-exec-5] c.m.m.C.getAllCategoriesWithLaws : <== Total: 5 +2025-04-17 13:08:20.746 DEBUG 10909 --- [http-nio-9092-exec-6] c.m.m.C.getAllCategoriesWithLaws : ==> Preparing: SELECT c.category_id, c.name, c.description, l.law_id, l.category_id AS law_category_id, l.title, l.summary, l.content, l.effective_date, l.reference_url FROM categories c LEFT JOIN laws l ON c.category_id = l.category_id ORDER BY c.category_id, l.law_id +2025-04-17 13:08:20.746 DEBUG 10909 --- [http-nio-9092-exec-6] c.m.m.C.getAllCategoriesWithLaws : ==> Parameters: +2025-04-17 13:08:20.793 DEBUG 10909 --- [http-nio-9092-exec-6] c.m.m.C.getAllCategoriesWithLaws : <== Total: 5 +2025-04-17 13:08:33.625 DEBUG 10909 --- [http-nio-9092-exec-7] c.m.m.C.getAllCategoriesWithLaws : ==> Preparing: SELECT c.category_id, c.name, c.description, l.law_id, l.category_id AS law_category_id, l.title, l.summary, l.content, l.effective_date, l.reference_url FROM categories c LEFT JOIN laws l ON c.category_id = l.category_id ORDER BY c.category_id, l.law_id +2025-04-17 13:08:33.626 DEBUG 10909 --- [http-nio-9092-exec-7] c.m.m.C.getAllCategoriesWithLaws : ==> Parameters: +2025-04-17 13:08:33.674 DEBUG 10909 --- [http-nio-9092-exec-7] c.m.m.C.getAllCategoriesWithLaws : <== Total: 5 +2025-04-17 13:09:26.126 DEBUG 10909 --- [http-nio-9092-exec-8] c.m.m.C.getAllCategoriesWithLaws : ==> Preparing: SELECT c.category_id, c.name, c.description, l.law_id, l.category_id AS law_category_id, l.title, l.summary, l.content, l.effective_date, l.reference_url FROM categories c LEFT JOIN laws l ON c.category_id = l.category_id ORDER BY c.category_id, l.law_id +2025-04-17 13:09:26.127 DEBUG 10909 --- [http-nio-9092-exec-8] c.m.m.C.getAllCategoriesWithLaws : ==> Parameters: +2025-04-17 13:09:26.172 DEBUG 10909 --- [http-nio-9092-exec-8] c.m.m.C.getAllCategoriesWithLaws : <== Total: 5 +2025-04-17 13:10:07.106 DEBUG 10909 --- [http-nio-9092-exec-9] c.m.m.C.getAllCategoriesWithLaws : ==> Preparing: SELECT c.category_id, c.name, c.description, l.law_id, l.category_id AS law_category_id, l.title, l.summary, l.content, l.effective_date, l.reference_url FROM categories c LEFT JOIN laws l ON c.category_id = l.category_id ORDER BY c.category_id, l.law_id +2025-04-17 13:10:07.106 DEBUG 10909 --- [http-nio-9092-exec-9] c.m.m.C.getAllCategoriesWithLaws : ==> Parameters: +2025-04-17 13:10:07.159 DEBUG 10909 --- [http-nio-9092-exec-9] c.m.m.C.getAllCategoriesWithLaws : <== Total: 5 +2025-04-17 13:13:42.960 DEBUG 10909 --- [http-nio-9092-exec-3] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM learning_resources +2025-04-17 13:13:42.960 DEBUG 10909 --- [http-nio-9092-exec-3] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 13:13:43.000 DEBUG 10909 --- [http-nio-9092-exec-3] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 13:13:43.001 DEBUG 10909 --- [http-nio-9092-exec-3] c.m.m.L.selectList : ==> Preparing: SELECT resource_id,title,type,url,duration,description FROM learning_resources LIMIT ?, ? +2025-04-17 13:13:43.004 DEBUG 10909 --- [http-nio-9092-exec-3] c.m.m.L.selectList : ==> Parameters: 2(Integer), 2(Integer) +2025-04-17 13:13:43.055 DEBUG 10909 --- [http-nio-9092-exec-3] c.m.m.L.selectList : <== Total: 2 +2025-04-17 13:13:48.247 DEBUG 10909 --- [http-nio-9092-exec-2] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM learning_resources +2025-04-17 13:13:48.248 DEBUG 10909 --- [http-nio-9092-exec-2] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 13:13:48.280 DEBUG 10909 --- [http-nio-9092-exec-2] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 13:13:48.280 DEBUG 10909 --- [http-nio-9092-exec-2] c.m.m.L.selectList : ==> Preparing: SELECT resource_id,title,type,url,duration,description FROM learning_resources LIMIT ? +2025-04-17 13:13:48.281 DEBUG 10909 --- [http-nio-9092-exec-2] c.m.m.L.selectList : ==> Parameters: 2(Integer) +2025-04-17 13:13:48.321 DEBUG 10909 --- [http-nio-9092-exec-2] c.m.m.L.selectList : <== Total: 2 +2025-04-17 13:18:13.786 DEBUG 10909 --- [http-nio-9092-exec-6] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM learning_resources +2025-04-17 13:18:13.787 DEBUG 10909 --- [http-nio-9092-exec-6] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 13:18:13.827 DEBUG 10909 --- [http-nio-9092-exec-6] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 13:18:13.828 DEBUG 10909 --- [http-nio-9092-exec-6] c.m.m.L.selectList : ==> Preparing: SELECT resource_id,title,type,url,duration,description FROM learning_resources LIMIT ? +2025-04-17 13:18:13.828 DEBUG 10909 --- [http-nio-9092-exec-6] c.m.m.L.selectList : ==> Parameters: 2(Integer) +2025-04-17 13:18:13.875 DEBUG 10909 --- [http-nio-9092-exec-6] c.m.m.L.selectList : <== Total: 2 +2025-04-17 13:18:20.525 DEBUG 10909 --- [http-nio-9092-exec-7] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM learning_resources +2025-04-17 13:18:20.525 DEBUG 10909 --- [http-nio-9092-exec-7] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 13:18:20.566 DEBUG 10909 --- [http-nio-9092-exec-7] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 13:18:20.567 DEBUG 10909 --- [http-nio-9092-exec-7] c.m.m.L.selectList : ==> Preparing: SELECT resource_id,title,type,url,duration,description FROM learning_resources LIMIT ? +2025-04-17 13:18:20.568 DEBUG 10909 --- [http-nio-9092-exec-7] c.m.m.L.selectList : ==> Parameters: 2(Integer) +2025-04-17 13:18:20.607 DEBUG 10909 --- [http-nio-9092-exec-7] c.m.m.L.selectList : <== Total: 2 +2025-04-17 13:18:31.555 DEBUG 10909 --- [http-nio-9092-exec-8] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM learning_resources +2025-04-17 13:18:31.556 DEBUG 10909 --- [http-nio-9092-exec-8] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 13:18:31.597 DEBUG 10909 --- [http-nio-9092-exec-8] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 13:18:31.597 DEBUG 10909 --- [http-nio-9092-exec-8] c.m.m.L.selectList : ==> Preparing: SELECT resource_id,title,type,url,duration,description FROM learning_resources LIMIT ? +2025-04-17 13:18:31.598 DEBUG 10909 --- [http-nio-9092-exec-8] c.m.m.L.selectList : ==> Parameters: 2(Integer) +2025-04-17 13:18:31.643 DEBUG 10909 --- [http-nio-9092-exec-8] c.m.m.L.selectList : <== Total: 2 +2025-04-17 13:19:10.622 DEBUG 10909 --- [http-nio-9092-exec-9] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM learning_resources +2025-04-17 13:19:10.622 DEBUG 10909 --- [http-nio-9092-exec-9] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 13:19:10.653 DEBUG 10909 --- [http-nio-9092-exec-9] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 13:19:10.654 DEBUG 10909 --- [http-nio-9092-exec-9] c.m.m.L.selectList : ==> Preparing: SELECT resource_id,title,type,url,duration,description FROM learning_resources LIMIT ? +2025-04-17 13:19:10.654 DEBUG 10909 --- [http-nio-9092-exec-9] c.m.m.L.selectList : ==> Parameters: 2(Integer) +2025-04-17 13:19:10.693 DEBUG 10909 --- [http-nio-9092-exec-9] c.m.m.L.selectList : <== Total: 2 +2025-04-17 13:19:44.861 DEBUG 10909 --- [http-nio-9092-exec-10] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM learning_resources +2025-04-17 13:19:44.862 DEBUG 10909 --- [http-nio-9092-exec-10] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 13:19:44.895 DEBUG 10909 --- [http-nio-9092-exec-10] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 13:19:44.896 DEBUG 10909 --- [http-nio-9092-exec-10] c.m.m.L.selectList : ==> Preparing: SELECT resource_id,title,type,url,duration,description FROM learning_resources LIMIT ? +2025-04-17 13:19:44.896 DEBUG 10909 --- [http-nio-9092-exec-10] c.m.m.L.selectList : ==> Parameters: 2(Integer) +2025-04-17 13:19:44.932 DEBUG 10909 --- [http-nio-9092-exec-10] c.m.m.L.selectList : <== Total: 2 +2025-04-17 13:19:51.392 DEBUG 10909 --- [http-nio-9092-exec-3] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM learning_resources +2025-04-17 13:19:51.393 DEBUG 10909 --- [http-nio-9092-exec-3] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 13:19:51.423 DEBUG 10909 --- [http-nio-9092-exec-3] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 13:19:51.424 DEBUG 10909 --- [http-nio-9092-exec-3] c.m.m.L.selectList : ==> Preparing: SELECT resource_id,title,type,url,duration,description FROM learning_resources LIMIT ?, ? +2025-04-17 13:19:51.425 DEBUG 10909 --- [http-nio-9092-exec-3] c.m.m.L.selectList : ==> Parameters: 2(Integer), 2(Integer) +2025-04-17 13:19:51.470 DEBUG 10909 --- [http-nio-9092-exec-3] c.m.m.L.selectList : <== Total: 2 +2025-04-17 13:19:53.512 DEBUG 10909 --- [http-nio-9092-exec-4] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM learning_resources +2025-04-17 13:19:53.512 DEBUG 10909 --- [http-nio-9092-exec-4] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 13:19:53.542 DEBUG 10909 --- [http-nio-9092-exec-4] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 13:19:53.543 DEBUG 10909 --- [http-nio-9092-exec-4] c.m.m.L.selectList : ==> Preparing: SELECT resource_id,title,type,url,duration,description FROM learning_resources LIMIT ?, ? +2025-04-17 13:19:53.543 DEBUG 10909 --- [http-nio-9092-exec-4] c.m.m.L.selectList : ==> Parameters: 4(Integer), 2(Integer) +2025-04-17 13:19:53.583 DEBUG 10909 --- [http-nio-9092-exec-4] c.m.m.L.selectList : <== Total: 1 +2025-04-17 13:20:01.962 DEBUG 10909 --- [http-nio-9092-exec-5] c.m.m.C.getAllCategoriesWithLaws : ==> Preparing: SELECT c.category_id, c.name, c.description, l.law_id, l.category_id AS law_category_id, l.title, l.summary, l.content, l.effective_date, l.reference_url FROM categories c LEFT JOIN laws l ON c.category_id = l.category_id ORDER BY c.category_id, l.law_id +2025-04-17 13:20:01.963 DEBUG 10909 --- [http-nio-9092-exec-5] c.m.m.C.getAllCategoriesWithLaws : ==> Parameters: +2025-04-17 13:20:02.007 DEBUG 10909 --- [http-nio-9092-exec-5] c.m.m.C.getAllCategoriesWithLaws : <== Total: 5 +2025-04-17 13:20:03.702 DEBUG 10909 --- [http-nio-9092-exec-6] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM learning_resources +2025-04-17 13:20:03.703 DEBUG 10909 --- [http-nio-9092-exec-6] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 13:20:03.733 DEBUG 10909 --- [http-nio-9092-exec-6] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 13:20:03.733 DEBUG 10909 --- [http-nio-9092-exec-6] c.m.m.L.selectList : ==> Preparing: SELECT resource_id,title,type,url,duration,description FROM learning_resources LIMIT ? +2025-04-17 13:20:03.734 DEBUG 10909 --- [http-nio-9092-exec-6] c.m.m.L.selectList : ==> Parameters: 2(Integer) +2025-04-17 13:20:03.780 DEBUG 10909 --- [http-nio-9092-exec-6] c.m.m.L.selectList : <== Total: 2 +2025-04-17 13:25:08.246 DEBUG 10909 --- [http-nio-9092-exec-8] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM learning_resources +2025-04-17 13:25:08.247 DEBUG 10909 --- [http-nio-9092-exec-8] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 13:25:08.291 DEBUG 10909 --- [http-nio-9092-exec-8] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 13:25:08.291 DEBUG 10909 --- [http-nio-9092-exec-8] c.m.m.L.selectList : ==> Preparing: SELECT resource_id,title,type,url,duration,description FROM learning_resources LIMIT ? +2025-04-17 13:25:08.292 DEBUG 10909 --- [http-nio-9092-exec-8] c.m.m.L.selectList : ==> Parameters: 2(Integer) +2025-04-17 13:25:08.332 DEBUG 10909 --- [http-nio-9092-exec-8] c.m.m.L.selectList : <== Total: 2 +2025-04-17 13:26:34.131 DEBUG 10909 --- [http-nio-9092-exec-10] c.m.m.C.getAllCategoriesWithLaws : ==> Preparing: SELECT c.category_id, c.name, c.description, l.law_id, l.category_id AS law_category_id, l.title, l.summary, l.content, l.effective_date, l.reference_url FROM categories c LEFT JOIN laws l ON c.category_id = l.category_id ORDER BY c.category_id, l.law_id +2025-04-17 13:26:34.132 DEBUG 10909 --- [http-nio-9092-exec-10] c.m.m.C.getAllCategoriesWithLaws : ==> Parameters: +2025-04-17 13:26:34.190 DEBUG 10909 --- [http-nio-9092-exec-10] c.m.m.C.getAllCategoriesWithLaws : <== Total: 5 +2025-04-17 13:26:34.891 DEBUG 10909 --- [http-nio-9092-exec-1] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM learning_resources +2025-04-17 13:26:34.891 DEBUG 10909 --- [http-nio-9092-exec-1] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 13:26:34.931 DEBUG 10909 --- [http-nio-9092-exec-1] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 13:26:34.932 DEBUG 10909 --- [http-nio-9092-exec-1] c.m.m.L.selectList : ==> Preparing: SELECT resource_id,title,type,url,duration,description FROM learning_resources LIMIT ? +2025-04-17 13:26:34.932 DEBUG 10909 --- [http-nio-9092-exec-1] c.m.m.L.selectList : ==> Parameters: 2(Integer) +2025-04-17 13:26:34.972 DEBUG 10909 --- [http-nio-9092-exec-1] c.m.m.L.selectList : <== Total: 2 +2025-04-17 13:30:44.171 DEBUG 10909 --- [http-nio-9092-exec-2] c.m.m.C.getAllCategoriesWithLaws : ==> Preparing: SELECT c.category_id, c.name, c.description, l.law_id, l.category_id AS law_category_id, l.title, l.summary, l.content, l.effective_date, l.reference_url FROM categories c LEFT JOIN laws l ON c.category_id = l.category_id ORDER BY c.category_id, l.law_id +2025-04-17 13:30:44.172 DEBUG 10909 --- [http-nio-9092-exec-2] c.m.m.C.getAllCategoriesWithLaws : ==> Parameters: +2025-04-17 13:30:44.234 DEBUG 10909 --- [http-nio-9092-exec-2] c.m.m.C.getAllCategoriesWithLaws : <== Total: 5 +2025-04-17 13:30:46.111 DEBUG 10909 --- [http-nio-9092-exec-4] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM learning_resources +2025-04-17 13:30:46.111 DEBUG 10909 --- [http-nio-9092-exec-4] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 13:30:46.150 DEBUG 10909 --- [http-nio-9092-exec-4] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 13:30:46.151 DEBUG 10909 --- [http-nio-9092-exec-4] c.m.m.L.selectList : ==> Preparing: SELECT resource_id,title,type,url,duration,description FROM learning_resources LIMIT ? +2025-04-17 13:30:46.151 DEBUG 10909 --- [http-nio-9092-exec-4] c.m.m.L.selectList : ==> Parameters: 2(Integer) +2025-04-17 13:30:46.198 DEBUG 10909 --- [http-nio-9092-exec-4] c.m.m.L.selectList : <== Total: 2 +2025-04-17 13:30:56.130 DEBUG 10909 --- [http-nio-9092-exec-5] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM learning_resources +2025-04-17 13:30:56.131 DEBUG 10909 --- [http-nio-9092-exec-5] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 13:30:56.171 DEBUG 10909 --- [http-nio-9092-exec-5] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 13:30:56.172 DEBUG 10909 --- [http-nio-9092-exec-5] c.m.m.L.selectList : ==> Preparing: SELECT resource_id,title,type,url,duration,description FROM learning_resources LIMIT ?, ? +2025-04-17 13:30:56.173 DEBUG 10909 --- [http-nio-9092-exec-5] c.m.m.L.selectList : ==> Parameters: 2(Integer), 2(Integer) +2025-04-17 13:30:56.220 DEBUG 10909 --- [http-nio-9092-exec-5] c.m.m.L.selectList : <== Total: 2 +2025-04-17 13:30:57.711 DEBUG 10909 --- [http-nio-9092-exec-6] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM learning_resources +2025-04-17 13:30:57.712 DEBUG 10909 --- [http-nio-9092-exec-6] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 13:30:57.751 DEBUG 10909 --- [http-nio-9092-exec-6] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 13:30:57.751 DEBUG 10909 --- [http-nio-9092-exec-6] c.m.m.L.selectList : ==> Preparing: SELECT resource_id,title,type,url,duration,description FROM learning_resources LIMIT ? +2025-04-17 13:30:57.751 DEBUG 10909 --- [http-nio-9092-exec-6] c.m.m.L.selectList : ==> Parameters: 2(Integer) +2025-04-17 13:30:57.793 DEBUG 10909 --- [http-nio-9092-exec-6] c.m.m.L.selectList : <== Total: 2 +2025-04-17 13:31:00.111 DEBUG 10909 --- [http-nio-9092-exec-7] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM learning_resources +2025-04-17 13:31:00.112 DEBUG 10909 --- [http-nio-9092-exec-7] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 13:31:00.160 DEBUG 10909 --- [http-nio-9092-exec-7] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 13:31:00.161 DEBUG 10909 --- [http-nio-9092-exec-7] c.m.m.L.selectList : ==> Preparing: SELECT resource_id,title,type,url,duration,description FROM learning_resources LIMIT ?, ? +2025-04-17 13:31:00.161 DEBUG 10909 --- [http-nio-9092-exec-7] c.m.m.L.selectList : ==> Parameters: 2(Integer), 2(Integer) +2025-04-17 13:31:00.191 DEBUG 10909 --- [http-nio-9092-exec-7] c.m.m.L.selectList : <== Total: 2 +2025-04-17 13:31:01.390 DEBUG 10909 --- [http-nio-9092-exec-8] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM learning_resources +2025-04-17 13:31:01.391 DEBUG 10909 --- [http-nio-9092-exec-8] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 13:31:01.430 DEBUG 10909 --- [http-nio-9092-exec-8] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 13:31:01.431 DEBUG 10909 --- [http-nio-9092-exec-8] c.m.m.L.selectList : ==> Preparing: SELECT resource_id,title,type,url,duration,description FROM learning_resources LIMIT ? +2025-04-17 13:31:01.431 DEBUG 10909 --- [http-nio-9092-exec-8] c.m.m.L.selectList : ==> Parameters: 2(Integer) +2025-04-17 13:31:01.478 DEBUG 10909 --- [http-nio-9092-exec-8] c.m.m.L.selectList : <== Total: 2 +2025-04-17 13:31:09.590 DEBUG 10909 --- [http-nio-9092-exec-9] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM learning_resources +2025-04-17 13:31:09.590 DEBUG 10909 --- [http-nio-9092-exec-9] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 13:31:09.631 DEBUG 10909 --- [http-nio-9092-exec-9] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 13:31:09.632 DEBUG 10909 --- [http-nio-9092-exec-9] c.m.m.L.selectList : ==> Preparing: SELECT resource_id,title,type,url,duration,description FROM learning_resources LIMIT ? +2025-04-17 13:31:09.632 DEBUG 10909 --- [http-nio-9092-exec-9] c.m.m.L.selectList : ==> Parameters: 2(Integer) +2025-04-17 13:31:09.671 DEBUG 10909 --- [http-nio-9092-exec-9] c.m.m.L.selectList : <== Total: 2 +2025-04-17 13:31:11.910 DEBUG 10909 --- [http-nio-9092-exec-10] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM learning_resources +2025-04-17 13:31:11.910 DEBUG 10909 --- [http-nio-9092-exec-10] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 13:31:11.950 DEBUG 10909 --- [http-nio-9092-exec-10] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 13:31:11.950 DEBUG 10909 --- [http-nio-9092-exec-10] c.m.m.L.selectList : ==> Preparing: SELECT resource_id,title,type,url,duration,description FROM learning_resources LIMIT ? +2025-04-17 13:31:11.951 DEBUG 10909 --- [http-nio-9092-exec-10] c.m.m.L.selectList : ==> Parameters: 2(Integer) +2025-04-17 13:31:11.990 DEBUG 10909 --- [http-nio-9092-exec-10] c.m.m.L.selectList : <== Total: 2 +2025-04-17 13:31:13.770 DEBUG 10909 --- [http-nio-9092-exec-1] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM learning_resources +2025-04-17 13:31:13.771 DEBUG 10909 --- [http-nio-9092-exec-1] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 13:31:13.811 DEBUG 10909 --- [http-nio-9092-exec-1] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 13:31:13.812 DEBUG 10909 --- [http-nio-9092-exec-1] c.m.m.L.selectList : ==> Preparing: SELECT resource_id,title,type,url,duration,description FROM learning_resources LIMIT ? +2025-04-17 13:31:13.812 DEBUG 10909 --- [http-nio-9092-exec-1] c.m.m.L.selectList : ==> Parameters: 2(Integer) +2025-04-17 13:31:13.853 DEBUG 10909 --- [http-nio-9092-exec-1] c.m.m.L.selectList : <== Total: 2 +2025-04-17 13:31:42.329 DEBUG 10909 --- [http-nio-9092-exec-3] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM learning_resources +2025-04-17 13:31:42.331 DEBUG 10909 --- [http-nio-9092-exec-3] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 13:31:42.376 DEBUG 10909 --- [http-nio-9092-exec-3] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 13:31:42.376 DEBUG 10909 --- [http-nio-9092-exec-3] c.m.m.L.selectList : ==> Preparing: SELECT resource_id,title,type,url,duration,description FROM learning_resources LIMIT ?, ? +2025-04-17 13:31:42.377 DEBUG 10909 --- [http-nio-9092-exec-3] c.m.m.L.selectList : ==> Parameters: 2(Integer), 2(Integer) +2025-04-17 13:31:42.412 DEBUG 10909 --- [http-nio-9092-exec-3] c.m.m.L.selectList : <== Total: 2 +2025-04-17 13:31:43.731 DEBUG 10909 --- [http-nio-9092-exec-2] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM learning_resources +2025-04-17 13:31:43.731 DEBUG 10909 --- [http-nio-9092-exec-2] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 13:31:43.772 DEBUG 10909 --- [http-nio-9092-exec-2] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 13:31:43.773 DEBUG 10909 --- [http-nio-9092-exec-2] c.m.m.L.selectList : ==> Preparing: SELECT resource_id,title,type,url,duration,description FROM learning_resources LIMIT ? +2025-04-17 13:31:43.773 DEBUG 10909 --- [http-nio-9092-exec-2] c.m.m.L.selectList : ==> Parameters: 2(Integer) +2025-04-17 13:31:43.823 DEBUG 10909 --- [http-nio-9092-exec-2] c.m.m.L.selectList : <== Total: 2 +2025-04-17 13:31:49.470 DEBUG 10909 --- [http-nio-9092-exec-4] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM learning_resources +2025-04-17 13:31:49.470 DEBUG 10909 --- [http-nio-9092-exec-4] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 13:31:49.518 DEBUG 10909 --- [http-nio-9092-exec-4] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 13:31:49.518 DEBUG 10909 --- [http-nio-9092-exec-4] c.m.m.L.selectList : ==> Preparing: SELECT resource_id,title,type,url,duration,description FROM learning_resources LIMIT ? +2025-04-17 13:31:49.518 DEBUG 10909 --- [http-nio-9092-exec-4] c.m.m.L.selectList : ==> Parameters: 2(Integer) +2025-04-17 13:31:49.551 DEBUG 10909 --- [http-nio-9092-exec-4] c.m.m.L.selectList : <== Total: 2 +2025-04-17 13:32:01.550 DEBUG 10909 --- [http-nio-9092-exec-5] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM learning_resources +2025-04-17 13:32:01.551 DEBUG 10909 --- [http-nio-9092-exec-5] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 13:32:01.591 DEBUG 10909 --- [http-nio-9092-exec-5] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 13:32:01.592 DEBUG 10909 --- [http-nio-9092-exec-5] c.m.m.L.selectList : ==> Preparing: SELECT resource_id,title,type,url,duration,description FROM learning_resources LIMIT ? +2025-04-17 13:32:01.592 DEBUG 10909 --- [http-nio-9092-exec-5] c.m.m.L.selectList : ==> Parameters: 2(Integer) +2025-04-17 13:32:01.632 DEBUG 10909 --- [http-nio-9092-exec-5] c.m.m.L.selectList : <== Total: 2 +2025-04-17 13:32:33.335 DEBUG 10909 --- [http-nio-9092-exec-7] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM learning_resources +2025-04-17 13:32:33.335 DEBUG 10909 --- [http-nio-9092-exec-7] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 13:32:33.381 DEBUG 10909 --- [http-nio-9092-exec-7] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 13:32:33.381 DEBUG 10909 --- [http-nio-9092-exec-7] c.m.m.L.selectList : ==> Preparing: SELECT resource_id,title,type,url,duration,description FROM learning_resources LIMIT ? +2025-04-17 13:32:33.382 DEBUG 10909 --- [http-nio-9092-exec-7] c.m.m.L.selectList : ==> Parameters: 2(Integer) +2025-04-17 13:32:33.427 DEBUG 10909 --- [http-nio-9092-exec-7] c.m.m.L.selectList : <== Total: 2 +2025-04-17 13:33:24.343 DEBUG 10909 --- [http-nio-9092-exec-8] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM learning_resources +2025-04-17 13:33:24.345 DEBUG 10909 --- [http-nio-9092-exec-8] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 13:33:24.377 DEBUG 10909 --- [http-nio-9092-exec-8] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 13:33:24.377 DEBUG 10909 --- [http-nio-9092-exec-8] c.m.m.L.selectList : ==> Preparing: SELECT resource_id,title,type,url,duration,description FROM learning_resources LIMIT ?, ? +2025-04-17 13:33:24.377 DEBUG 10909 --- [http-nio-9092-exec-8] c.m.m.L.selectList : ==> Parameters: 2(Integer), 2(Integer) +2025-04-17 13:33:24.429 DEBUG 10909 --- [http-nio-9092-exec-8] c.m.m.L.selectList : <== Total: 2 +2025-04-17 13:33:28.578 DEBUG 10909 --- [http-nio-9092-exec-9] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM learning_resources +2025-04-17 13:33:28.579 DEBUG 10909 --- [http-nio-9092-exec-9] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 13:33:28.619 DEBUG 10909 --- [http-nio-9092-exec-9] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 13:33:28.619 DEBUG 10909 --- [http-nio-9092-exec-9] c.m.m.L.selectList : ==> Preparing: SELECT resource_id,title,type,url,duration,description FROM learning_resources LIMIT ? +2025-04-17 13:33:28.620 DEBUG 10909 --- [http-nio-9092-exec-9] c.m.m.L.selectList : ==> Parameters: 2(Integer) +2025-04-17 13:33:28.669 DEBUG 10909 --- [http-nio-9092-exec-9] c.m.m.L.selectList : <== Total: 2 +2025-04-17 13:34:37.337 DEBUG 10909 --- [http-nio-9092-exec-1] c.m.m.C.getAllCategoriesWithLaws : ==> Preparing: SELECT c.category_id, c.name, c.description, l.law_id, l.category_id AS law_category_id, l.title, l.summary, l.content, l.effective_date, l.reference_url FROM categories c LEFT JOIN laws l ON c.category_id = l.category_id ORDER BY c.category_id, l.law_id +2025-04-17 13:34:37.337 DEBUG 10909 --- [http-nio-9092-exec-1] c.m.m.C.getAllCategoriesWithLaws : ==> Parameters: +2025-04-17 13:34:37.386 DEBUG 10909 --- [http-nio-9092-exec-1] c.m.m.C.getAllCategoriesWithLaws : <== Total: 5 +2025-04-17 13:34:38.488 DEBUG 10909 --- [http-nio-9092-exec-3] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM learning_resources +2025-04-17 13:34:38.488 DEBUG 10909 --- [http-nio-9092-exec-3] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 13:34:38.545 DEBUG 10909 --- [http-nio-9092-exec-3] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 13:34:38.546 DEBUG 10909 --- [http-nio-9092-exec-3] c.m.m.L.selectList : ==> Preparing: SELECT resource_id,title,type,url,duration,description FROM learning_resources LIMIT ? +2025-04-17 13:34:38.546 DEBUG 10909 --- [http-nio-9092-exec-3] c.m.m.L.selectList : ==> Parameters: 2(Integer) +2025-04-17 13:34:38.587 DEBUG 10909 --- [http-nio-9092-exec-3] c.m.m.L.selectList : <== Total: 2 +2025-04-17 13:35:05.850 DEBUG 10909 --- [http-nio-9092-exec-2] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM learning_resources +2025-04-17 13:35:05.851 DEBUG 10909 --- [http-nio-9092-exec-2] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 13:35:05.890 DEBUG 10909 --- [http-nio-9092-exec-2] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 13:35:05.891 DEBUG 10909 --- [http-nio-9092-exec-2] c.m.m.L.selectList : ==> Preparing: SELECT resource_id,title,type,url,duration,description FROM learning_resources LIMIT ? +2025-04-17 13:35:05.891 DEBUG 10909 --- [http-nio-9092-exec-2] c.m.m.L.selectList : ==> Parameters: 2(Integer) +2025-04-17 13:35:05.930 DEBUG 10909 --- [http-nio-9092-exec-2] c.m.m.L.selectList : <== Total: 2 +2025-04-17 13:35:29.990 DEBUG 10909 --- [http-nio-9092-exec-4] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM learning_resources +2025-04-17 13:35:29.990 DEBUG 10909 --- [http-nio-9092-exec-4] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 13:35:30.030 DEBUG 10909 --- [http-nio-9092-exec-4] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 13:35:30.030 DEBUG 10909 --- [http-nio-9092-exec-4] c.m.m.L.selectList : ==> Preparing: SELECT resource_id,title,type,url,duration,description FROM learning_resources LIMIT ? +2025-04-17 13:35:30.031 DEBUG 10909 --- [http-nio-9092-exec-4] c.m.m.L.selectList : ==> Parameters: 2(Integer) +2025-04-17 13:35:30.070 DEBUG 10909 --- [http-nio-9092-exec-4] c.m.m.L.selectList : <== Total: 2 +2025-04-17 13:36:04.172 DEBUG 10909 --- [http-nio-9092-exec-5] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM learning_resources +2025-04-17 13:36:04.173 DEBUG 10909 --- [http-nio-9092-exec-5] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 13:36:04.214 DEBUG 10909 --- [http-nio-9092-exec-5] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 13:36:04.214 DEBUG 10909 --- [http-nio-9092-exec-5] c.m.m.L.selectList : ==> Preparing: SELECT resource_id,title,type,url,duration,description FROM learning_resources LIMIT ? +2025-04-17 13:36:04.214 DEBUG 10909 --- [http-nio-9092-exec-5] c.m.m.L.selectList : ==> Parameters: 2(Integer) +2025-04-17 13:36:04.255 DEBUG 10909 --- [http-nio-9092-exec-5] c.m.m.L.selectList : <== Total: 2 +2025-04-17 13:36:50.991 DEBUG 10909 --- [http-nio-9092-exec-7] c.mingchen.common.config.JwtLoginFilter : Request is to process authentication +2025-04-17 13:36:51.112 DEBUG 10909 --- [http-nio-9092-exec-7] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-17 13:36:51.112 DEBUG 10909 --- [http-nio-9092-exec-7] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-17 13:36:51.162 DEBUG 10909 --- [http-nio-9092-exec-7] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-17 13:36:51.293 DEBUG 10909 --- [http-nio-9092-exec-8] c.m.m.C.getAllCategoriesWithLaws : ==> Preparing: SELECT c.category_id, c.name, c.description, l.law_id, l.category_id AS law_category_id, l.title, l.summary, l.content, l.effective_date, l.reference_url FROM categories c LEFT JOIN laws l ON c.category_id = l.category_id ORDER BY c.category_id, l.law_id +2025-04-17 13:36:51.293 DEBUG 10909 --- [http-nio-9092-exec-8] c.m.m.C.getAllCategoriesWithLaws : ==> Parameters: +2025-04-17 13:36:51.340 DEBUG 10909 --- [http-nio-9092-exec-8] c.m.m.C.getAllCategoriesWithLaws : <== Total: 5 +2025-04-17 13:37:20.293 DEBUG 10909 --- [http-nio-9092-exec-9] c.mingchen.common.config.JwtLoginFilter : Request is to process authentication +2025-04-17 13:37:20.357 DEBUG 10909 --- [http-nio-9092-exec-9] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-17 13:37:20.357 DEBUG 10909 --- [http-nio-9092-exec-9] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-17 13:37:20.409 DEBUG 10909 --- [http-nio-9092-exec-9] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-17 13:37:20.550 DEBUG 10909 --- [http-nio-9092-exec-10] c.m.m.C.getAllCategoriesWithLaws : ==> Preparing: SELECT c.category_id, c.name, c.description, l.law_id, l.category_id AS law_category_id, l.title, l.summary, l.content, l.effective_date, l.reference_url FROM categories c LEFT JOIN laws l ON c.category_id = l.category_id ORDER BY c.category_id, l.law_id +2025-04-17 13:37:20.550 DEBUG 10909 --- [http-nio-9092-exec-10] c.m.m.C.getAllCategoriesWithLaws : ==> Parameters: +2025-04-17 13:37:20.600 DEBUG 10909 --- [http-nio-9092-exec-10] c.m.m.C.getAllCategoriesWithLaws : <== Total: 5 +2025-04-17 13:43:21.945 DEBUG 10909 --- [http-nio-9092-exec-3] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM learning_resources +2025-04-17 13:43:21.946 DEBUG 10909 --- [http-nio-9092-exec-3] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 13:43:21.984 DEBUG 10909 --- [http-nio-9092-exec-3] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 13:43:21.985 DEBUG 10909 --- [http-nio-9092-exec-3] c.m.m.L.selectList : ==> Preparing: SELECT resource_id,title,type,url,duration,description FROM learning_resources LIMIT ? +2025-04-17 13:43:21.986 DEBUG 10909 --- [http-nio-9092-exec-3] c.m.m.L.selectList : ==> Parameters: 2(Integer) +2025-04-17 13:43:22.020 DEBUG 10909 --- [http-nio-9092-exec-3] c.m.m.L.selectList : <== Total: 2 +2025-04-17 13:43:33.462 DEBUG 10909 --- [http-nio-9092-exec-2] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM learning_resources +2025-04-17 13:43:33.463 DEBUG 10909 --- [http-nio-9092-exec-2] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 13:43:33.510 DEBUG 10909 --- [http-nio-9092-exec-2] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 13:43:33.511 DEBUG 10909 --- [http-nio-9092-exec-2] c.m.m.L.selectList : ==> Preparing: SELECT resource_id,title,type,url,duration,description FROM learning_resources LIMIT ? +2025-04-17 13:43:33.511 DEBUG 10909 --- [http-nio-9092-exec-2] c.m.m.L.selectList : ==> Parameters: 2(Integer) +2025-04-17 13:43:33.547 DEBUG 10909 --- [http-nio-9092-exec-2] c.m.m.L.selectList : <== Total: 2 +2025-04-17 13:43:37.067 DEBUG 10909 --- [http-nio-9092-exec-4] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM learning_resources +2025-04-17 13:43:37.068 DEBUG 10909 --- [http-nio-9092-exec-4] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 13:43:37.100 DEBUG 10909 --- [http-nio-9092-exec-4] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 13:43:37.101 DEBUG 10909 --- [http-nio-9092-exec-4] c.m.m.L.selectList : ==> Preparing: SELECT resource_id,title,type,url,duration,description FROM learning_resources LIMIT ? +2025-04-17 13:43:37.101 DEBUG 10909 --- [http-nio-9092-exec-4] c.m.m.L.selectList : ==> Parameters: 2(Integer) +2025-04-17 13:43:37.148 DEBUG 10909 --- [http-nio-9092-exec-4] c.m.m.L.selectList : <== Total: 2 +2025-04-17 13:43:39.093 DEBUG 10909 --- [http-nio-9092-exec-5] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM learning_resources +2025-04-17 13:43:39.093 DEBUG 10909 --- [http-nio-9092-exec-5] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 13:43:39.130 DEBUG 10909 --- [http-nio-9092-exec-5] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 13:43:39.132 DEBUG 10909 --- [http-nio-9092-exec-5] c.m.m.L.selectList : ==> Preparing: SELECT resource_id,title,type,url,duration,description FROM learning_resources LIMIT ?, ? +2025-04-17 13:43:39.132 DEBUG 10909 --- [http-nio-9092-exec-5] c.m.m.L.selectList : ==> Parameters: 4(Integer), 2(Integer) +2025-04-17 13:43:39.163 DEBUG 10909 --- [http-nio-9092-exec-5] c.m.m.L.selectList : <== Total: 1 +2025-04-17 13:43:41.344 DEBUG 10909 --- [http-nio-9092-exec-6] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM learning_resources +2025-04-17 13:43:41.345 DEBUG 10909 --- [http-nio-9092-exec-6] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 13:43:41.383 DEBUG 10909 --- [http-nio-9092-exec-6] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 13:43:41.383 DEBUG 10909 --- [http-nio-9092-exec-6] c.m.m.L.selectList : ==> Preparing: SELECT resource_id,title,type,url,duration,description FROM learning_resources LIMIT ? +2025-04-17 13:43:41.383 DEBUG 10909 --- [http-nio-9092-exec-6] c.m.m.L.selectList : ==> Parameters: 2(Integer) +2025-04-17 13:43:41.419 DEBUG 10909 --- [http-nio-9092-exec-6] c.m.m.L.selectList : <== Total: 2 +2025-04-17 13:44:44.454 DEBUG 10909 --- [http-nio-9092-exec-8] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM learning_resources +2025-04-17 13:44:44.454 DEBUG 10909 --- [http-nio-9092-exec-8] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 13:44:44.493 DEBUG 10909 --- [http-nio-9092-exec-8] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 13:44:44.493 DEBUG 10909 --- [http-nio-9092-exec-8] c.m.m.L.selectList : ==> Preparing: SELECT resource_id,title,type,url,duration,description FROM learning_resources LIMIT ?, ? +2025-04-17 13:44:44.493 DEBUG 10909 --- [http-nio-9092-exec-8] c.m.m.L.selectList : ==> Parameters: 2(Integer), 2(Integer) +2025-04-17 13:44:44.535 DEBUG 10909 --- [http-nio-9092-exec-8] c.m.m.L.selectList : <== Total: 2 +2025-04-17 13:44:45.413 DEBUG 10909 --- [http-nio-9092-exec-9] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM learning_resources +2025-04-17 13:44:45.414 DEBUG 10909 --- [http-nio-9092-exec-9] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 13:44:45.454 DEBUG 10909 --- [http-nio-9092-exec-9] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 13:44:45.455 DEBUG 10909 --- [http-nio-9092-exec-9] c.m.m.L.selectList : ==> Preparing: SELECT resource_id,title,type,url,duration,description FROM learning_resources LIMIT ?, ? +2025-04-17 13:44:45.455 DEBUG 10909 --- [http-nio-9092-exec-9] c.m.m.L.selectList : ==> Parameters: 4(Integer), 2(Integer) +2025-04-17 13:44:45.496 DEBUG 10909 --- [http-nio-9092-exec-9] c.m.m.L.selectList : <== Total: 1 +2025-04-17 13:44:46.848 DEBUG 10909 --- [http-nio-9092-exec-10] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM learning_resources +2025-04-17 13:44:46.849 DEBUG 10909 --- [http-nio-9092-exec-10] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 13:44:46.882 DEBUG 10909 --- [http-nio-9092-exec-10] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 13:44:46.883 DEBUG 10909 --- [http-nio-9092-exec-10] c.m.m.L.selectList : ==> Preparing: SELECT resource_id,title,type,url,duration,description FROM learning_resources LIMIT ? +2025-04-17 13:44:46.883 DEBUG 10909 --- [http-nio-9092-exec-10] c.m.m.L.selectList : ==> Parameters: 2(Integer) +2025-04-17 13:44:46.914 DEBUG 10909 --- [http-nio-9092-exec-10] c.m.m.L.selectList : <== Total: 2 +2025-04-17 13:50:24.910 INFO 10909 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED paused. +2025-04-17 13:50:24.912 INFO 10909 --- [SpringContextShutdownHook] o.s.s.quartz.SchedulerFactoryBean : Shutting down Quartz Scheduler +2025-04-17 13:50:24.912 INFO 10909 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED shutting down. +2025-04-17 13:50:24.912 INFO 10909 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED paused. +2025-04-17 13:50:24.912 INFO 10909 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED shutdown complete. +2025-04-17 13:50:24.913 INFO 10909 --- [SpringContextShutdownHook] o.s.s.concurrent.ThreadPoolTaskExecutor : Shutting down ExecutorService 'applicationTaskExecutor' +2025-04-17 13:50:24.920 INFO 10909 --- [SpringContextShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown initiated... +2025-04-17 13:50:24.920 INFO 10909 --- [SpringContextShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown completed. +2025-04-17 13:50:28.096 INFO 14376 --- [restartedMain] com.mingchen.BlogApiApplication : Starting BlogApiApplication on mingchendeMac-mini.local with PID 14376 (/Users/mingchen/code/java/other/legalAid/api/target/classes started by mingchen in /Users/mingchen/code/java/other/legalAid) +2025-04-17 13:50:28.097 DEBUG 14376 --- [restartedMain] com.mingchen.BlogApiApplication : Running with Spring Boot v2.2.7.RELEASE, Spring v5.2.6.RELEASE +2025-04-17 13:50:28.097 INFO 14376 --- [restartedMain] com.mingchen.BlogApiApplication : The following profiles are active: dev +2025-04-17 13:50:28.113 INFO 14376 --- [restartedMain] o.s.b.devtools.restart.ChangeableUrls : The Class-Path manifest attribute in /usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/jaxb-runtime-2.3.1.jar referenced one or more files that do not exist: file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/jaxb-api-2.3.1.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/txw2-2.3.1.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/istack-commons-runtime-3.0.7.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/stax-ex-1.8.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/FastInfoset-1.2.15.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/javax.activation-api-1.2.0.jar +2025-04-17 13:50:28.113 INFO 14376 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : Devtools property defaults active! Set 'spring.devtools.add-properties' to 'false' to disable +2025-04-17 13:50:28.113 INFO 14376 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : For additional web related logging consider setting the 'logging.level.web' property to 'DEBUG' +2025-04-17 13:50:28.336 INFO 14376 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Multiple Spring Data modules found, entering strict repository configuration mode! +2025-04-17 13:50:28.337 INFO 14376 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data Redis repositories in DEFAULT mode. +2025-04-17 13:50:28.348 INFO 14376 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 7ms. Found 0 Redis repository interfaces. +2025-04-17 13:50:28.611 INFO 14376 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 9092 (http) +2025-04-17 13:50:28.615 INFO 14376 --- [restartedMain] o.apache.catalina.core.StandardService : Starting service [Tomcat] +2025-04-17 13:50:28.615 INFO 14376 --- [restartedMain] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.34] +2025-04-17 13:50:28.639 INFO 14376 --- [restartedMain] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext +2025-04-17 13:50:28.639 INFO 14376 --- [restartedMain] o.s.web.context.ContextLoader : Root WebApplicationContext: initialization completed in 526 ms +2025-04-17 13:50:29.202 INFO 14376 --- [restartedMain] n.b.p.u.AbstractUserAgentAnalyzerDirect : - Loaded 90 files in 218 msec using expression: classpath*:UserAgents/**/*.yaml +2025-04-17 13:50:29.202 INFO 14376 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : +2025-04-17 13:50:29.202 INFO 14376 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : /-----------------------------------------------------------\ +2025-04-17 13:50:29.202 INFO 14376 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : | Yauaa 5.20 (v5.20 @ 2020-11-22T15:39:16Z) | +2025-04-17 13:50:29.202 INFO 14376 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : +-----------------------------------------------------------+ +2025-04-17 13:50:29.202 INFO 14376 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : | For more information: https://yauaa.basjes.nl | +2025-04-17 13:50:29.202 INFO 14376 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : | Copyright (C) 2013-2020 Niels Basjes - License Apache 2.0 | +2025-04-17 13:50:29.202 INFO 14376 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : \-----------------------------------------------------------/ +2025-04-17 13:50:29.202 INFO 14376 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : +2025-04-17 13:50:29.207 INFO 14376 --- [restartedMain] n.b.p.u.AbstractUserAgentAnalyzerDirect : Building all needed matchers for the requested 11 fields. +2025-04-17 13:50:29.265 INFO 14376 --- [restartedMain] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor' +2025-04-17 13:50:29.351 INFO 14376 --- [restartedMain] org.quartz.impl.StdSchedulerFactory : Using default implementation for ThreadExecutor +2025-04-17 13:50:29.355 INFO 14376 --- [restartedMain] org.quartz.core.SchedulerSignalerImpl : Initialized Scheduler Signaller of type: class org.quartz.core.SchedulerSignalerImpl +2025-04-17 13:50:29.355 INFO 14376 --- [restartedMain] org.quartz.core.QuartzScheduler : Quartz Scheduler v.2.3.2 created. +2025-04-17 13:50:29.355 INFO 14376 --- [restartedMain] org.quartz.simpl.RAMJobStore : RAMJobStore initialized. +2025-04-17 13:50:29.355 INFO 14376 --- [restartedMain] org.quartz.core.QuartzScheduler : Scheduler meta-data: Quartz Scheduler (v2.3.2) 'quartzScheduler' with instanceId 'NON_CLUSTERED' + Scheduler class: 'org.quartz.core.QuartzScheduler' - running locally. + NOT STARTED. + Currently in standby mode. + Number of jobs executed: 0 + Using thread pool 'org.quartz.simpl.SimpleThreadPool' - with 10 threads. + Using job-store 'org.quartz.simpl.RAMJobStore' - which does not support persistence. and is not clustered. + +2025-04-17 13:50:29.355 INFO 14376 --- [restartedMain] org.quartz.impl.StdSchedulerFactory : Quartz scheduler 'quartzScheduler' initialized from an externally provided properties instance. +2025-04-17 13:50:29.355 INFO 14376 --- [restartedMain] org.quartz.impl.StdSchedulerFactory : Quartz scheduler version: 2.3.2 +2025-04-17 13:50:29.355 INFO 14376 --- [restartedMain] org.quartz.core.QuartzScheduler : JobFactory set to: org.springframework.scheduling.quartz.SpringBeanJobFactory@9fa23f7 +2025-04-17 13:50:29.386 INFO 14376 --- [restartedMain] o.s.s.web.DefaultSecurityFilterChain : Creating filter chain: any request, [org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter@65d7e6e0, org.springframework.security.web.context.SecurityContextPersistenceFilter@46a289e5, org.springframework.security.web.header.HeaderWriterFilter@314d9dc4, org.springframework.web.filter.CorsFilter@612f24d4, org.springframework.security.web.authentication.logout.LogoutFilter@3cf63c83, com.mingchen.common.config.JwtLoginFilter@72c36199, com.mingchen.common.config.JwtFilter@5037efa2, org.springframework.security.web.savedrequest.RequestCacheAwareFilter@340db4ba, org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter@30b61ce3, org.springframework.security.web.authentication.AnonymousAuthenticationFilter@a0df3a2, org.springframework.security.web.session.SessionManagementFilter@61287c85, org.springframework.security.web.access.ExceptionTranslationFilter@600e4a03, org.springframework.security.web.access.intercept.FilterSecurityInterceptor@2a7f0e49] +2025-04-17 13:50:29.397 INFO 14376 --- [restartedMain] o.s.b.d.a.OptionalLiveReloadServer : LiveReload server is running on port 35729 +2025-04-17 13:50:29.406 INFO 14376 --- [restartedMain] o.s.s.quartz.SchedulerFactoryBean : Starting Quartz Scheduler now +2025-04-17 13:50:29.406 INFO 14376 --- [restartedMain] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED started. +2025-04-17 13:50:29.416 INFO 14376 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 9092 (http) with context path '' +2025-04-17 13:50:29.419 INFO 14376 --- [restartedMain] com.mingchen.BlogApiApplication : Started BlogApiApplication in 1.484 seconds (JVM running for 1.774) +2025-04-17 13:51:27.309 INFO 14376 --- [http-nio-9092-exec-2] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet' +2025-04-17 13:51:27.309 INFO 14376 --- [http-nio-9092-exec-2] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet' +2025-04-17 13:51:27.312 INFO 14376 --- [http-nio-9092-exec-2] o.s.web.servlet.DispatcherServlet : Completed initialization in 3 ms +2025-04-17 13:51:27.390 INFO 14376 --- [http-nio-9092-exec-2] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting... +2025-04-17 13:51:27.913 INFO 14376 --- [http-nio-9092-exec-2] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed. +2025-04-17 13:51:27.922 DEBUG 14376 --- [http-nio-9092-exec-2] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM legalAidResources +2025-04-17 13:51:27.941 DEBUG 14376 --- [http-nio-9092-exec-2] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 13:51:28.009 DEBUG 14376 --- [http-nio-9092-exec-2] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 13:51:28.013 DEBUG 14376 --- [http-nio-9092-exec-2] c.m.m.L.selectList : ==> Preparing: SELECT aid_id,name,type,phone_number,email,address,website_url,is_emergency,description FROM legalAidResources LIMIT ? +2025-04-17 13:51:28.013 DEBUG 14376 --- [http-nio-9092-exec-2] c.m.m.L.selectList : ==> Parameters: 2(Integer) +2025-04-17 13:51:28.061 DEBUG 14376 --- [http-nio-9092-exec-2] c.m.m.L.selectList : <== Total: 2 +2025-04-17 13:51:53.012 DEBUG 14376 --- [http-nio-9092-exec-3] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM legalAidResources +2025-04-17 13:51:53.013 DEBUG 14376 --- [http-nio-9092-exec-3] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 13:51:53.053 DEBUG 14376 --- [http-nio-9092-exec-3] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 13:51:53.054 DEBUG 14376 --- [http-nio-9092-exec-3] c.m.m.L.selectList : ==> Preparing: SELECT aid_id,name,type,phone_number,email,address,website_url,is_emergency,description FROM legalAidResources LIMIT ? +2025-04-17 13:51:53.054 DEBUG 14376 --- [http-nio-9092-exec-3] c.m.m.L.selectList : ==> Parameters: 6(Integer) +2025-04-17 13:51:53.101 DEBUG 14376 --- [http-nio-9092-exec-3] c.m.m.L.selectList : <== Total: 4 +2025-04-17 14:00:14.347 INFO 14376 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED paused. +2025-04-17 14:00:14.349 INFO 14376 --- [SpringContextShutdownHook] o.s.s.quartz.SchedulerFactoryBean : Shutting down Quartz Scheduler +2025-04-17 14:00:14.349 INFO 14376 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED shutting down. +2025-04-17 14:00:14.350 INFO 14376 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED paused. +2025-04-17 14:00:14.350 INFO 14376 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED shutdown complete. +2025-04-17 14:00:14.350 INFO 14376 --- [SpringContextShutdownHook] o.s.s.concurrent.ThreadPoolTaskExecutor : Shutting down ExecutorService 'applicationTaskExecutor' +2025-04-17 14:00:14.357 INFO 14376 --- [SpringContextShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown initiated... +2025-04-17 14:00:14.360 INFO 14376 --- [SpringContextShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown completed. +2025-04-17 14:00:16.748 INFO 14952 --- [restartedMain] com.mingchen.BlogApiApplication : Starting BlogApiApplication on mingchendeMac-mini.local with PID 14952 (/Users/mingchen/code/java/other/legalAid/api/target/classes started by mingchen in /Users/mingchen/code/java/other/legalAid) +2025-04-17 14:00:16.749 DEBUG 14952 --- [restartedMain] com.mingchen.BlogApiApplication : Running with Spring Boot v2.2.7.RELEASE, Spring v5.2.6.RELEASE +2025-04-17 14:00:16.750 INFO 14952 --- [restartedMain] com.mingchen.BlogApiApplication : The following profiles are active: dev +2025-04-17 14:00:16.766 INFO 14952 --- [restartedMain] o.s.b.devtools.restart.ChangeableUrls : The Class-Path manifest attribute in /usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/jaxb-runtime-2.3.1.jar referenced one or more files that do not exist: file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/jaxb-api-2.3.1.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/txw2-2.3.1.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/istack-commons-runtime-3.0.7.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/stax-ex-1.8.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/FastInfoset-1.2.15.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/javax.activation-api-1.2.0.jar +2025-04-17 14:00:16.766 INFO 14952 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : Devtools property defaults active! Set 'spring.devtools.add-properties' to 'false' to disable +2025-04-17 14:00:16.766 INFO 14952 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : For additional web related logging consider setting the 'logging.level.web' property to 'DEBUG' +2025-04-17 14:00:16.984 INFO 14952 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Multiple Spring Data modules found, entering strict repository configuration mode! +2025-04-17 14:00:16.985 INFO 14952 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data Redis repositories in DEFAULT mode. +2025-04-17 14:00:16.997 INFO 14952 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 7ms. Found 0 Redis repository interfaces. +2025-04-17 14:00:17.239 INFO 14952 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 9092 (http) +2025-04-17 14:00:17.242 INFO 14952 --- [restartedMain] o.apache.catalina.core.StandardService : Starting service [Tomcat] +2025-04-17 14:00:17.242 INFO 14952 --- [restartedMain] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.34] +2025-04-17 14:00:17.264 INFO 14952 --- [restartedMain] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext +2025-04-17 14:00:17.264 INFO 14952 --- [restartedMain] o.s.web.context.ContextLoader : Root WebApplicationContext: initialization completed in 498 ms +2025-04-17 14:00:17.793 INFO 14952 --- [restartedMain] n.b.p.u.AbstractUserAgentAnalyzerDirect : - Loaded 90 files in 224 msec using expression: classpath*:UserAgents/**/*.yaml +2025-04-17 14:00:17.793 INFO 14952 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : +2025-04-17 14:00:17.793 INFO 14952 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : /-----------------------------------------------------------\ +2025-04-17 14:00:17.793 INFO 14952 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : | Yauaa 5.20 (v5.20 @ 2020-11-22T15:39:16Z) | +2025-04-17 14:00:17.793 INFO 14952 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : +-----------------------------------------------------------+ +2025-04-17 14:00:17.793 INFO 14952 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : | For more information: https://yauaa.basjes.nl | +2025-04-17 14:00:17.793 INFO 14952 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : | Copyright (C) 2013-2020 Niels Basjes - License Apache 2.0 | +2025-04-17 14:00:17.793 INFO 14952 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : \-----------------------------------------------------------/ +2025-04-17 14:00:17.793 INFO 14952 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : +2025-04-17 14:00:17.799 INFO 14952 --- [restartedMain] n.b.p.u.AbstractUserAgentAnalyzerDirect : Building all needed matchers for the requested 11 fields. +2025-04-17 14:00:17.860 INFO 14952 --- [restartedMain] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor' +2025-04-17 14:00:17.951 INFO 14952 --- [restartedMain] org.quartz.impl.StdSchedulerFactory : Using default implementation for ThreadExecutor +2025-04-17 14:00:17.955 INFO 14952 --- [restartedMain] org.quartz.core.SchedulerSignalerImpl : Initialized Scheduler Signaller of type: class org.quartz.core.SchedulerSignalerImpl +2025-04-17 14:00:17.955 INFO 14952 --- [restartedMain] org.quartz.core.QuartzScheduler : Quartz Scheduler v.2.3.2 created. +2025-04-17 14:00:17.955 INFO 14952 --- [restartedMain] org.quartz.simpl.RAMJobStore : RAMJobStore initialized. +2025-04-17 14:00:17.955 INFO 14952 --- [restartedMain] org.quartz.core.QuartzScheduler : Scheduler meta-data: Quartz Scheduler (v2.3.2) 'quartzScheduler' with instanceId 'NON_CLUSTERED' + Scheduler class: 'org.quartz.core.QuartzScheduler' - running locally. + NOT STARTED. + Currently in standby mode. + Number of jobs executed: 0 + Using thread pool 'org.quartz.simpl.SimpleThreadPool' - with 10 threads. + Using job-store 'org.quartz.simpl.RAMJobStore' - which does not support persistence. and is not clustered. + +2025-04-17 14:00:17.955 INFO 14952 --- [restartedMain] org.quartz.impl.StdSchedulerFactory : Quartz scheduler 'quartzScheduler' initialized from an externally provided properties instance. +2025-04-17 14:00:17.955 INFO 14952 --- [restartedMain] org.quartz.impl.StdSchedulerFactory : Quartz scheduler version: 2.3.2 +2025-04-17 14:00:17.956 INFO 14952 --- [restartedMain] org.quartz.core.QuartzScheduler : JobFactory set to: org.springframework.scheduling.quartz.SpringBeanJobFactory@46870ffb +2025-04-17 14:00:17.988 INFO 14952 --- [restartedMain] o.s.s.web.DefaultSecurityFilterChain : Creating filter chain: any request, [org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter@3116e514, org.springframework.security.web.context.SecurityContextPersistenceFilter@7e4db188, org.springframework.security.web.header.HeaderWriterFilter@65f4a665, org.springframework.web.filter.CorsFilter@3d3c8d81, org.springframework.security.web.authentication.logout.LogoutFilter@b9e0dc9, com.mingchen.common.config.JwtLoginFilter@44081f83, com.mingchen.common.config.JwtFilter@69cf0b00, org.springframework.security.web.savedrequest.RequestCacheAwareFilter@4213d280, org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter@62501da3, org.springframework.security.web.authentication.AnonymousAuthenticationFilter@6f777d68, org.springframework.security.web.session.SessionManagementFilter@c16d019, org.springframework.security.web.access.ExceptionTranslationFilter@5e40e6a6, org.springframework.security.web.access.intercept.FilterSecurityInterceptor@7e8adde3] +2025-04-17 14:00:18.001 INFO 14952 --- [restartedMain] o.s.b.d.a.OptionalLiveReloadServer : LiveReload server is running on port 35729 +2025-04-17 14:00:18.010 INFO 14952 --- [restartedMain] o.s.s.quartz.SchedulerFactoryBean : Starting Quartz Scheduler now +2025-04-17 14:00:18.010 INFO 14952 --- [restartedMain] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED started. +2025-04-17 14:00:18.021 INFO 14952 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 9092 (http) with context path '' +2025-04-17 14:00:18.023 INFO 14952 --- [restartedMain] com.mingchen.BlogApiApplication : Started BlogApiApplication in 1.434 seconds (JVM running for 1.733) +2025-04-17 14:00:20.971 INFO 14952 --- [http-nio-9092-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet' +2025-04-17 14:00:20.971 INFO 14952 --- [http-nio-9092-exec-1] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet' +2025-04-17 14:00:20.973 INFO 14952 --- [http-nio-9092-exec-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 2 ms +2025-04-17 14:00:21.054 INFO 14952 --- [http-nio-9092-exec-1] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting... +2025-04-17 14:00:21.512 INFO 14952 --- [http-nio-9092-exec-1] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed. +2025-04-17 14:00:21.523 DEBUG 14952 --- [http-nio-9092-exec-1] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM legalAidResources +2025-04-17 14:00:21.546 DEBUG 14952 --- [http-nio-9092-exec-1] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 14:00:21.606 DEBUG 14952 --- [http-nio-9092-exec-1] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 14:00:21.610 DEBUG 14952 --- [http-nio-9092-exec-1] c.m.m.L.selectList : ==> Preparing: SELECT aid_id,name,type,phone_number,email,avatar,address,website_url,is_emergency,description FROM legalAidResources LIMIT ? +2025-04-17 14:00:21.610 DEBUG 14952 --- [http-nio-9092-exec-1] c.m.m.L.selectList : ==> Parameters: 6(Integer) +2025-04-17 14:00:21.664 DEBUG 14952 --- [http-nio-9092-exec-1] c.m.m.L.selectList : <== Total: 6 +2025-04-17 14:00:35.047 DEBUG 14952 --- [http-nio-9092-exec-3] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM learning_resources +2025-04-17 14:00:35.048 DEBUG 14952 --- [http-nio-9092-exec-3] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 14:00:35.085 DEBUG 14952 --- [http-nio-9092-exec-3] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 14:00:35.086 DEBUG 14952 --- [http-nio-9092-exec-3] c.m.m.L.selectList : ==> Preparing: SELECT resource_id,title,type,url,duration,description FROM learning_resources LIMIT ? +2025-04-17 14:00:35.086 DEBUG 14952 --- [http-nio-9092-exec-3] c.m.m.L.selectList : ==> Parameters: 2(Integer) +2025-04-17 14:00:35.128 DEBUG 14952 --- [http-nio-9092-exec-3] c.m.m.L.selectList : <== Total: 2 +2025-04-17 14:03:32.227 DEBUG 14952 --- [http-nio-9092-exec-6] c.m.m.C.getAllCategoriesWithLaws : ==> Preparing: SELECT c.category_id, c.name, c.description, l.law_id, l.category_id AS law_category_id, l.title, l.summary, l.content, l.effective_date, l.reference_url FROM categories c LEFT JOIN laws l ON c.category_id = l.category_id ORDER BY c.category_id, l.law_id +2025-04-17 14:03:32.228 DEBUG 14952 --- [http-nio-9092-exec-6] c.m.m.C.getAllCategoriesWithLaws : ==> Parameters: +2025-04-17 14:03:32.281 DEBUG 14952 --- [http-nio-9092-exec-6] c.m.m.C.getAllCategoriesWithLaws : <== Total: 5 +2025-04-17 14:04:47.886 DEBUG 14952 --- [http-nio-9092-exec-8] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM learning_resources +2025-04-17 14:04:47.887 DEBUG 14952 --- [http-nio-9092-exec-8] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 14:04:47.926 DEBUG 14952 --- [http-nio-9092-exec-8] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 14:04:47.927 DEBUG 14952 --- [http-nio-9092-exec-8] c.m.m.L.selectList : ==> Preparing: SELECT resource_id,title,type,url,duration,description FROM learning_resources LIMIT ? +2025-04-17 14:04:47.927 DEBUG 14952 --- [http-nio-9092-exec-8] c.m.m.L.selectList : ==> Parameters: 2(Integer) +2025-04-17 14:04:47.967 DEBUG 14952 --- [http-nio-9092-exec-8] c.m.m.L.selectList : <== Total: 2 +2025-04-17 14:04:52.066 DEBUG 14952 --- [http-nio-9092-exec-9] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM learning_resources +2025-04-17 14:04:52.067 DEBUG 14952 --- [http-nio-9092-exec-9] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 14:04:52.109 DEBUG 14952 --- [http-nio-9092-exec-9] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 14:04:52.110 DEBUG 14952 --- [http-nio-9092-exec-9] c.m.m.L.selectList : ==> Preparing: SELECT resource_id,title,type,url,duration,description FROM learning_resources LIMIT ? +2025-04-17 14:04:52.110 DEBUG 14952 --- [http-nio-9092-exec-9] c.m.m.L.selectList : ==> Parameters: 2(Integer) +2025-04-17 14:04:52.148 DEBUG 14952 --- [http-nio-9092-exec-9] c.m.m.L.selectList : <== Total: 2 +2025-04-17 14:04:54.586 DEBUG 14952 --- [http-nio-9092-exec-10] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM learning_resources +2025-04-17 14:04:54.586 DEBUG 14952 --- [http-nio-9092-exec-10] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 14:04:54.630 DEBUG 14952 --- [http-nio-9092-exec-10] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 14:04:54.631 DEBUG 14952 --- [http-nio-9092-exec-10] c.m.m.L.selectList : ==> Preparing: SELECT resource_id,title,type,url,duration,description FROM learning_resources LIMIT ? +2025-04-17 14:04:54.631 DEBUG 14952 --- [http-nio-9092-exec-10] c.m.m.L.selectList : ==> Parameters: 2(Integer) +2025-04-17 14:04:54.671 DEBUG 14952 --- [http-nio-9092-exec-10] c.m.m.L.selectList : <== Total: 2 +2025-04-17 14:04:56.447 DEBUG 14952 --- [http-nio-9092-exec-2] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM learning_resources +2025-04-17 14:04:56.447 DEBUG 14952 --- [http-nio-9092-exec-2] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 14:04:56.487 DEBUG 14952 --- [http-nio-9092-exec-2] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 14:04:56.488 DEBUG 14952 --- [http-nio-9092-exec-2] c.m.m.L.selectList : ==> Preparing: SELECT resource_id,title,type,url,duration,description FROM learning_resources LIMIT ? +2025-04-17 14:04:56.488 DEBUG 14952 --- [http-nio-9092-exec-2] c.m.m.L.selectList : ==> Parameters: 2(Integer) +2025-04-17 14:04:56.526 DEBUG 14952 --- [http-nio-9092-exec-2] c.m.m.L.selectList : <== Total: 2 +2025-04-17 14:04:59.247 DEBUG 14952 --- [http-nio-9092-exec-1] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM learning_resources +2025-04-17 14:04:59.247 DEBUG 14952 --- [http-nio-9092-exec-1] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 14:04:59.287 DEBUG 14952 --- [http-nio-9092-exec-1] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 14:04:59.288 DEBUG 14952 --- [http-nio-9092-exec-1] c.m.m.L.selectList : ==> Preparing: SELECT resource_id,title,type,url,duration,description FROM learning_resources LIMIT ? +2025-04-17 14:04:59.288 DEBUG 14952 --- [http-nio-9092-exec-1] c.m.m.L.selectList : ==> Parameters: 2(Integer) +2025-04-17 14:04:59.327 DEBUG 14952 --- [http-nio-9092-exec-1] c.m.m.L.selectList : <== Total: 2 +2025-04-17 14:06:38.847 DEBUG 14952 --- [http-nio-9092-exec-4] c.m.m.C.getAllCategoriesWithLaws : ==> Preparing: SELECT c.category_id, c.name, c.description, l.law_id, l.category_id AS law_category_id, l.title, l.summary, l.content, l.effective_date, l.reference_url FROM categories c LEFT JOIN laws l ON c.category_id = l.category_id ORDER BY c.category_id, l.law_id +2025-04-17 14:06:38.848 DEBUG 14952 --- [http-nio-9092-exec-4] c.m.m.C.getAllCategoriesWithLaws : ==> Parameters: +2025-04-17 14:06:38.900 DEBUG 14952 --- [http-nio-9092-exec-4] c.m.m.C.getAllCategoriesWithLaws : <== Total: 5 +2025-04-17 14:06:39.530 DEBUG 14952 --- [http-nio-9092-exec-6] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM legalAidResources +2025-04-17 14:06:39.530 DEBUG 14952 --- [http-nio-9092-exec-6] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 14:06:39.567 DEBUG 14952 --- [http-nio-9092-exec-6] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 14:06:39.568 DEBUG 14952 --- [http-nio-9092-exec-6] c.m.m.L.selectList : ==> Preparing: SELECT aid_id,name,type,phone_number,email,avatar,address,website_url,is_emergency,description FROM legalAidResources LIMIT ? +2025-04-17 14:06:39.568 DEBUG 14952 --- [http-nio-9092-exec-6] c.m.m.L.selectList : ==> Parameters: 6(Integer) +2025-04-17 14:06:39.613 DEBUG 14952 --- [http-nio-9092-exec-6] c.m.m.L.selectList : <== Total: 6 +2025-04-17 14:06:53.091 DEBUG 14952 --- [http-nio-9092-exec-7] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM legalAidResources +2025-04-17 14:06:53.092 DEBUG 14952 --- [http-nio-9092-exec-7] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 14:06:53.133 DEBUG 14952 --- [http-nio-9092-exec-7] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 14:06:53.133 DEBUG 14952 --- [http-nio-9092-exec-7] c.m.m.L.selectList : ==> Preparing: SELECT aid_id,name,type,phone_number,email,avatar,address,website_url,is_emergency,description FROM legalAidResources LIMIT ? +2025-04-17 14:06:53.133 DEBUG 14952 --- [http-nio-9092-exec-7] c.m.m.L.selectList : ==> Parameters: 6(Integer) +2025-04-17 14:06:53.172 DEBUG 14952 --- [http-nio-9092-exec-7] c.m.m.L.selectList : <== Total: 6 +2025-04-17 14:07:08.621 DEBUG 14952 --- [http-nio-9092-exec-9] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM legalAidResources +2025-04-17 14:07:08.623 DEBUG 14952 --- [http-nio-9092-exec-9] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 14:07:08.663 DEBUG 14952 --- [http-nio-9092-exec-9] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 14:07:08.664 DEBUG 14952 --- [http-nio-9092-exec-9] c.m.m.L.selectList : ==> Preparing: SELECT aid_id,name,type,phone_number,email,avatar,address,website_url,is_emergency,description FROM legalAidResources LIMIT ?, ? +2025-04-17 14:07:08.664 DEBUG 14952 --- [http-nio-9092-exec-9] c.m.m.L.selectList : ==> Parameters: 6(Integer), 6(Integer) +2025-04-17 14:07:08.714 DEBUG 14952 --- [http-nio-9092-exec-9] c.m.m.L.selectList : <== Total: 6 +2025-04-17 14:07:21.522 DEBUG 14952 --- [http-nio-9092-exec-10] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM legalAidResources +2025-04-17 14:07:21.523 DEBUG 14952 --- [http-nio-9092-exec-10] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 14:07:21.562 DEBUG 14952 --- [http-nio-9092-exec-10] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 14:07:21.562 DEBUG 14952 --- [http-nio-9092-exec-10] c.m.m.L.selectList : ==> Preparing: SELECT aid_id,name,type,phone_number,email,avatar,address,website_url,is_emergency,description FROM legalAidResources LIMIT ? +2025-04-17 14:07:21.563 DEBUG 14952 --- [http-nio-9092-exec-10] c.m.m.L.selectList : ==> Parameters: 6(Integer) +2025-04-17 14:07:21.610 DEBUG 14952 --- [http-nio-9092-exec-10] c.m.m.L.selectList : <== Total: 6 +2025-04-17 14:07:44.443 DEBUG 14952 --- [http-nio-9092-exec-2] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM learning_resources +2025-04-17 14:07:44.444 DEBUG 14952 --- [http-nio-9092-exec-2] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 14:07:44.483 DEBUG 14952 --- [http-nio-9092-exec-2] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 14:07:44.484 DEBUG 14952 --- [http-nio-9092-exec-2] c.m.m.L.selectList : ==> Preparing: SELECT resource_id,title,type,url,duration,description FROM learning_resources LIMIT ? +2025-04-17 14:07:44.485 DEBUG 14952 --- [http-nio-9092-exec-2] c.m.m.L.selectList : ==> Parameters: 2(Integer) +2025-04-17 14:07:44.523 DEBUG 14952 --- [http-nio-9092-exec-2] c.m.m.L.selectList : <== Total: 2 +2025-04-17 14:07:44.950 DEBUG 14952 --- [http-nio-9092-exec-1] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM legalAidResources +2025-04-17 14:07:44.951 DEBUG 14952 --- [http-nio-9092-exec-1] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 14:07:45.013 DEBUG 14952 --- [http-nio-9092-exec-1] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 14:07:45.014 DEBUG 14952 --- [http-nio-9092-exec-1] c.m.m.L.selectList : ==> Preparing: SELECT aid_id,name,type,phone_number,email,avatar,address,website_url,is_emergency,description FROM legalAidResources LIMIT ? +2025-04-17 14:07:45.014 DEBUG 14952 --- [http-nio-9092-exec-1] c.m.m.L.selectList : ==> Parameters: 6(Integer) +2025-04-17 14:07:45.058 DEBUG 14952 --- [http-nio-9092-exec-1] c.m.m.L.selectList : <== Total: 6 +2025-04-17 14:07:47.701 DEBUG 14952 --- [http-nio-9092-exec-4] c.m.m.C.getAllCategoriesWithLaws : ==> Preparing: SELECT c.category_id, c.name, c.description, l.law_id, l.category_id AS law_category_id, l.title, l.summary, l.content, l.effective_date, l.reference_url FROM categories c LEFT JOIN laws l ON c.category_id = l.category_id ORDER BY c.category_id, l.law_id +2025-04-17 14:07:47.701 DEBUG 14952 --- [http-nio-9092-exec-4] c.m.m.C.getAllCategoriesWithLaws : ==> Parameters: +2025-04-17 14:07:47.744 DEBUG 14952 --- [http-nio-9092-exec-4] c.m.m.C.getAllCategoriesWithLaws : <== Total: 5 +2025-04-17 14:07:48.463 DEBUG 14952 --- [http-nio-9092-exec-5] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM legalAidResources +2025-04-17 14:07:48.463 DEBUG 14952 --- [http-nio-9092-exec-5] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 14:07:48.502 DEBUG 14952 --- [http-nio-9092-exec-5] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 14:07:48.503 DEBUG 14952 --- [http-nio-9092-exec-5] c.m.m.L.selectList : ==> Preparing: SELECT aid_id,name,type,phone_number,email,avatar,address,website_url,is_emergency,description FROM legalAidResources LIMIT ? +2025-04-17 14:07:48.503 DEBUG 14952 --- [http-nio-9092-exec-5] c.m.m.L.selectList : ==> Parameters: 6(Integer) +2025-04-17 14:07:48.550 DEBUG 14952 --- [http-nio-9092-exec-5] c.m.m.L.selectList : <== Total: 6 +2025-04-17 14:07:50.552 DEBUG 14952 --- [http-nio-9092-exec-6] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM learning_resources +2025-04-17 14:07:50.553 DEBUG 14952 --- [http-nio-9092-exec-6] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 14:07:50.592 DEBUG 14952 --- [http-nio-9092-exec-6] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 14:07:50.593 DEBUG 14952 --- [http-nio-9092-exec-6] c.m.m.L.selectList : ==> Preparing: SELECT resource_id,title,type,url,duration,description FROM learning_resources LIMIT ? +2025-04-17 14:07:50.594 DEBUG 14952 --- [http-nio-9092-exec-6] c.m.m.L.selectList : ==> Parameters: 2(Integer) +2025-04-17 14:07:50.642 DEBUG 14952 --- [http-nio-9092-exec-6] c.m.m.L.selectList : <== Total: 2 +2025-04-17 14:07:54.271 DEBUG 14952 --- [http-nio-9092-exec-7] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM learning_resources +2025-04-17 14:07:54.271 DEBUG 14952 --- [http-nio-9092-exec-7] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 14:07:54.303 DEBUG 14952 --- [http-nio-9092-exec-7] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 14:07:54.304 DEBUG 14952 --- [http-nio-9092-exec-7] c.m.m.L.selectList : ==> Preparing: SELECT resource_id,title,type,url,duration,description FROM learning_resources LIMIT ? +2025-04-17 14:07:54.304 DEBUG 14952 --- [http-nio-9092-exec-7] c.m.m.L.selectList : ==> Parameters: 2(Integer) +2025-04-17 14:07:54.346 DEBUG 14952 --- [http-nio-9092-exec-7] c.m.m.L.selectList : <== Total: 2 +2025-04-17 14:07:54.693 DEBUG 14952 --- [http-nio-9092-exec-8] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM legalAidResources +2025-04-17 14:07:54.694 DEBUG 14952 --- [http-nio-9092-exec-8] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 14:07:54.732 DEBUG 14952 --- [http-nio-9092-exec-8] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 14:07:54.732 DEBUG 14952 --- [http-nio-9092-exec-8] c.m.m.L.selectList : ==> Preparing: SELECT aid_id,name,type,phone_number,email,avatar,address,website_url,is_emergency,description FROM legalAidResources LIMIT ? +2025-04-17 14:07:54.732 DEBUG 14952 --- [http-nio-9092-exec-8] c.m.m.L.selectList : ==> Parameters: 6(Integer) +2025-04-17 14:07:54.774 DEBUG 14952 --- [http-nio-9092-exec-8] c.m.m.L.selectList : <== Total: 6 +2025-04-17 14:07:55.382 DEBUG 14952 --- [http-nio-9092-exec-9] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM learning_resources +2025-04-17 14:07:55.382 DEBUG 14952 --- [http-nio-9092-exec-9] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 14:07:55.423 DEBUG 14952 --- [http-nio-9092-exec-9] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 14:07:55.423 DEBUG 14952 --- [http-nio-9092-exec-9] c.m.m.L.selectList : ==> Preparing: SELECT resource_id,title,type,url,duration,description FROM learning_resources LIMIT ? +2025-04-17 14:07:55.424 DEBUG 14952 --- [http-nio-9092-exec-9] c.m.m.L.selectList : ==> Parameters: 2(Integer) +2025-04-17 14:07:55.463 DEBUG 14952 --- [http-nio-9092-exec-9] c.m.m.L.selectList : <== Total: 2 +2025-04-17 14:07:55.767 DEBUG 14952 --- [http-nio-9092-exec-10] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM legalAidResources +2025-04-17 14:07:55.768 DEBUG 14952 --- [http-nio-9092-exec-10] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 14:07:55.812 DEBUG 14952 --- [http-nio-9092-exec-10] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 14:07:55.813 DEBUG 14952 --- [http-nio-9092-exec-10] c.m.m.L.selectList : ==> Preparing: SELECT aid_id,name,type,phone_number,email,avatar,address,website_url,is_emergency,description FROM legalAidResources LIMIT ? +2025-04-17 14:07:55.813 DEBUG 14952 --- [http-nio-9092-exec-10] c.m.m.L.selectList : ==> Parameters: 6(Integer) +2025-04-17 14:07:55.853 DEBUG 14952 --- [http-nio-9092-exec-10] c.m.m.L.selectList : <== Total: 6 +2025-04-17 14:07:56.943 DEBUG 14952 --- [http-nio-9092-exec-2] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM learning_resources +2025-04-17 14:07:56.943 DEBUG 14952 --- [http-nio-9092-exec-2] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 14:07:56.983 DEBUG 14952 --- [http-nio-9092-exec-2] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 14:07:56.984 DEBUG 14952 --- [http-nio-9092-exec-2] c.m.m.L.selectList : ==> Preparing: SELECT resource_id,title,type,url,duration,description FROM learning_resources LIMIT ? +2025-04-17 14:07:56.984 DEBUG 14952 --- [http-nio-9092-exec-2] c.m.m.L.selectList : ==> Parameters: 2(Integer) +2025-04-17 14:07:57.030 DEBUG 14952 --- [http-nio-9092-exec-2] c.m.m.L.selectList : <== Total: 2 +2025-04-17 14:07:57.415 DEBUG 14952 --- [http-nio-9092-exec-1] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM legalAidResources +2025-04-17 14:07:57.415 DEBUG 14952 --- [http-nio-9092-exec-1] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 14:07:57.473 DEBUG 14952 --- [http-nio-9092-exec-1] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 14:07:57.474 DEBUG 14952 --- [http-nio-9092-exec-1] c.m.m.L.selectList : ==> Preparing: SELECT aid_id,name,type,phone_number,email,avatar,address,website_url,is_emergency,description FROM legalAidResources LIMIT ? +2025-04-17 14:07:57.474 DEBUG 14952 --- [http-nio-9092-exec-1] c.m.m.L.selectList : ==> Parameters: 6(Integer) +2025-04-17 14:07:57.525 DEBUG 14952 --- [http-nio-9092-exec-1] c.m.m.L.selectList : <== Total: 6 +2025-04-17 14:07:58.213 DEBUG 14952 --- [http-nio-9092-exec-3] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM learning_resources +2025-04-17 14:07:58.213 DEBUG 14952 --- [http-nio-9092-exec-3] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 14:07:58.253 DEBUG 14952 --- [http-nio-9092-exec-3] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 14:07:58.254 DEBUG 14952 --- [http-nio-9092-exec-3] c.m.m.L.selectList : ==> Preparing: SELECT resource_id,title,type,url,duration,description FROM learning_resources LIMIT ? +2025-04-17 14:07:58.254 DEBUG 14952 --- [http-nio-9092-exec-3] c.m.m.L.selectList : ==> Parameters: 2(Integer) +2025-04-17 14:07:58.293 DEBUG 14952 --- [http-nio-9092-exec-3] c.m.m.L.selectList : <== Total: 2 +2025-04-17 14:07:58.563 DEBUG 14952 --- [http-nio-9092-exec-4] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM legalAidResources +2025-04-17 14:07:58.564 DEBUG 14952 --- [http-nio-9092-exec-4] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 14:07:58.629 DEBUG 14952 --- [http-nio-9092-exec-4] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 14:07:58.629 DEBUG 14952 --- [http-nio-9092-exec-4] c.m.m.L.selectList : ==> Preparing: SELECT aid_id,name,type,phone_number,email,avatar,address,website_url,is_emergency,description FROM legalAidResources LIMIT ? +2025-04-17 14:07:58.630 DEBUG 14952 --- [http-nio-9092-exec-4] c.m.m.L.selectList : ==> Parameters: 6(Integer) +2025-04-17 14:07:58.669 DEBUG 14952 --- [http-nio-9092-exec-4] c.m.m.L.selectList : <== Total: 6 +2025-04-17 14:07:58.953 DEBUG 14952 --- [http-nio-9092-exec-5] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM learning_resources +2025-04-17 14:07:58.953 DEBUG 14952 --- [http-nio-9092-exec-5] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 14:07:59.014 DEBUG 14952 --- [http-nio-9092-exec-5] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 14:07:59.015 DEBUG 14952 --- [http-nio-9092-exec-5] c.m.m.L.selectList : ==> Preparing: SELECT resource_id,title,type,url,duration,description FROM learning_resources LIMIT ? +2025-04-17 14:07:59.015 DEBUG 14952 --- [http-nio-9092-exec-5] c.m.m.L.selectList : ==> Parameters: 2(Integer) +2025-04-17 14:07:59.052 DEBUG 14952 --- [http-nio-9092-exec-5] c.m.m.L.selectList : <== Total: 2 +2025-04-17 14:07:59.359 DEBUG 14952 --- [http-nio-9092-exec-6] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM legalAidResources +2025-04-17 14:07:59.360 DEBUG 14952 --- [http-nio-9092-exec-6] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 14:07:59.412 DEBUG 14952 --- [http-nio-9092-exec-6] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 14:07:59.413 DEBUG 14952 --- [http-nio-9092-exec-6] c.m.m.L.selectList : ==> Preparing: SELECT aid_id,name,type,phone_number,email,avatar,address,website_url,is_emergency,description FROM legalAidResources LIMIT ? +2025-04-17 14:07:59.413 DEBUG 14952 --- [http-nio-9092-exec-6] c.m.m.L.selectList : ==> Parameters: 6(Integer) +2025-04-17 14:07:59.459 DEBUG 14952 --- [http-nio-9092-exec-6] c.m.m.L.selectList : <== Total: 6 +2025-04-17 14:08:00.028 DEBUG 14952 --- [http-nio-9092-exec-7] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM learning_resources +2025-04-17 14:08:00.028 DEBUG 14952 --- [http-nio-9092-exec-7] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 14:08:00.062 DEBUG 14952 --- [http-nio-9092-exec-7] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 14:08:00.063 DEBUG 14952 --- [http-nio-9092-exec-7] c.m.m.L.selectList : ==> Preparing: SELECT resource_id,title,type,url,duration,description FROM learning_resources LIMIT ? +2025-04-17 14:08:00.063 DEBUG 14952 --- [http-nio-9092-exec-7] c.m.m.L.selectList : ==> Parameters: 2(Integer) +2025-04-17 14:08:00.102 DEBUG 14952 --- [http-nio-9092-exec-7] c.m.m.L.selectList : <== Total: 2 +2025-04-17 14:08:00.418 DEBUG 14952 --- [http-nio-9092-exec-8] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM legalAidResources +2025-04-17 14:08:00.419 DEBUG 14952 --- [http-nio-9092-exec-8] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 14:08:00.477 DEBUG 14952 --- [http-nio-9092-exec-8] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 14:08:00.478 DEBUG 14952 --- [http-nio-9092-exec-8] c.m.m.L.selectList : ==> Preparing: SELECT aid_id,name,type,phone_number,email,avatar,address,website_url,is_emergency,description FROM legalAidResources LIMIT ? +2025-04-17 14:08:00.478 DEBUG 14952 --- [http-nio-9092-exec-8] c.m.m.L.selectList : ==> Parameters: 6(Integer) +2025-04-17 14:08:00.520 DEBUG 14952 --- [http-nio-9092-exec-8] c.m.m.L.selectList : <== Total: 6 +2025-04-17 14:08:00.774 DEBUG 14952 --- [http-nio-9092-exec-9] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM learning_resources +2025-04-17 14:08:00.774 DEBUG 14952 --- [http-nio-9092-exec-9] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 14:08:00.818 DEBUG 14952 --- [http-nio-9092-exec-9] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 14:08:00.819 DEBUG 14952 --- [http-nio-9092-exec-9] c.m.m.L.selectList : ==> Preparing: SELECT resource_id,title,type,url,duration,description FROM learning_resources LIMIT ? +2025-04-17 14:08:00.819 DEBUG 14952 --- [http-nio-9092-exec-9] c.m.m.L.selectList : ==> Parameters: 2(Integer) +2025-04-17 14:08:00.866 DEBUG 14952 --- [http-nio-9092-exec-9] c.m.m.L.selectList : <== Total: 2 +2025-04-17 14:08:01.188 DEBUG 14952 --- [http-nio-9092-exec-10] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM legalAidResources +2025-04-17 14:08:01.189 DEBUG 14952 --- [http-nio-9092-exec-10] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 14:08:01.232 DEBUG 14952 --- [http-nio-9092-exec-10] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 14:08:01.232 DEBUG 14952 --- [http-nio-9092-exec-10] c.m.m.L.selectList : ==> Preparing: SELECT aid_id,name,type,phone_number,email,avatar,address,website_url,is_emergency,description FROM legalAidResources LIMIT ? +2025-04-17 14:08:01.233 DEBUG 14952 --- [http-nio-9092-exec-10] c.m.m.L.selectList : ==> Parameters: 6(Integer) +2025-04-17 14:08:01.269 DEBUG 14952 --- [http-nio-9092-exec-10] c.m.m.L.selectList : <== Total: 6 +2025-04-17 14:08:01.597 DEBUG 14952 --- [http-nio-9092-exec-2] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM learning_resources +2025-04-17 14:08:01.597 DEBUG 14952 --- [http-nio-9092-exec-2] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 14:08:01.657 DEBUG 14952 --- [http-nio-9092-exec-2] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 14:08:01.658 DEBUG 14952 --- [http-nio-9092-exec-2] c.m.m.L.selectList : ==> Preparing: SELECT resource_id,title,type,url,duration,description FROM learning_resources LIMIT ? +2025-04-17 14:08:01.658 DEBUG 14952 --- [http-nio-9092-exec-2] c.m.m.L.selectList : ==> Parameters: 2(Integer) +2025-04-17 14:08:01.692 DEBUG 14952 --- [http-nio-9092-exec-2] c.m.m.L.selectList : <== Total: 2 +2025-04-17 14:08:02.019 DEBUG 14952 --- [http-nio-9092-exec-1] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM legalAidResources +2025-04-17 14:08:02.019 DEBUG 14952 --- [http-nio-9092-exec-1] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 14:08:02.072 DEBUG 14952 --- [http-nio-9092-exec-1] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 14:08:02.072 DEBUG 14952 --- [http-nio-9092-exec-1] c.m.m.L.selectList : ==> Preparing: SELECT aid_id,name,type,phone_number,email,avatar,address,website_url,is_emergency,description FROM legalAidResources LIMIT ? +2025-04-17 14:08:02.072 DEBUG 14952 --- [http-nio-9092-exec-1] c.m.m.L.selectList : ==> Parameters: 6(Integer) +2025-04-17 14:08:02.103 DEBUG 14952 --- [http-nio-9092-exec-1] c.m.m.L.selectList : <== Total: 6 +2025-04-17 14:08:22.608 DEBUG 14952 --- [http-nio-9092-exec-3] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM legalAidResources +2025-04-17 14:08:22.609 DEBUG 14952 --- [http-nio-9092-exec-3] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 14:08:22.644 DEBUG 14952 --- [http-nio-9092-exec-3] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 14:08:22.645 DEBUG 14952 --- [http-nio-9092-exec-3] c.m.m.L.selectList : ==> Preparing: SELECT aid_id,name,type,phone_number,email,avatar,address,website_url,is_emergency,description FROM legalAidResources LIMIT ?, ? +2025-04-17 14:08:22.645 DEBUG 14952 --- [http-nio-9092-exec-3] c.m.m.L.selectList : ==> Parameters: 6(Integer), 6(Integer) +2025-04-17 14:08:22.684 DEBUG 14952 --- [http-nio-9092-exec-3] c.m.m.L.selectList : <== Total: 6 +2025-04-17 14:08:23.532 DEBUG 14952 --- [http-nio-9092-exec-5] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM legalAidResources +2025-04-17 14:08:23.532 DEBUG 14952 --- [http-nio-9092-exec-5] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 14:08:23.562 DEBUG 14952 --- [http-nio-9092-exec-5] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 14:08:23.563 DEBUG 14952 --- [http-nio-9092-exec-5] c.m.m.L.selectList : ==> Preparing: SELECT aid_id,name,type,phone_number,email,avatar,address,website_url,is_emergency,description FROM legalAidResources LIMIT ?, ? +2025-04-17 14:08:23.563 DEBUG 14952 --- [http-nio-9092-exec-5] c.m.m.L.selectList : ==> Parameters: 12(Integer), 6(Integer) +2025-04-17 14:08:23.610 DEBUG 14952 --- [http-nio-9092-exec-5] c.m.m.L.selectList : <== Total: 2 +2025-04-17 14:08:25.352 DEBUG 14952 --- [http-nio-9092-exec-6] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM legalAidResources +2025-04-17 14:08:25.352 DEBUG 14952 --- [http-nio-9092-exec-6] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 14:08:25.392 DEBUG 14952 --- [http-nio-9092-exec-6] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 14:08:25.393 DEBUG 14952 --- [http-nio-9092-exec-6] c.m.m.L.selectList : ==> Preparing: SELECT aid_id,name,type,phone_number,email,avatar,address,website_url,is_emergency,description FROM legalAidResources LIMIT ? +2025-04-17 14:08:25.394 DEBUG 14952 --- [http-nio-9092-exec-6] c.m.m.L.selectList : ==> Parameters: 6(Integer) +2025-04-17 14:08:25.437 DEBUG 14952 --- [http-nio-9092-exec-6] c.m.m.L.selectList : <== Total: 6 +2025-04-17 14:08:28.632 DEBUG 14952 --- [http-nio-9092-exec-7] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM learning_resources +2025-04-17 14:08:28.632 DEBUG 14952 --- [http-nio-9092-exec-7] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 14:08:28.674 DEBUG 14952 --- [http-nio-9092-exec-7] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 14:08:28.674 DEBUG 14952 --- [http-nio-9092-exec-7] c.m.m.L.selectList : ==> Preparing: SELECT resource_id,title,type,url,duration,description FROM learning_resources LIMIT ? +2025-04-17 14:08:28.675 DEBUG 14952 --- [http-nio-9092-exec-7] c.m.m.L.selectList : ==> Parameters: 2(Integer) +2025-04-17 14:08:28.713 DEBUG 14952 --- [http-nio-9092-exec-7] c.m.m.L.selectList : <== Total: 2 +2025-04-17 14:08:44.558 DEBUG 14952 --- [http-nio-9092-exec-8] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM legalAidResources +2025-04-17 14:08:44.559 DEBUG 14952 --- [http-nio-9092-exec-8] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 14:08:44.598 DEBUG 14952 --- [http-nio-9092-exec-8] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 14:08:44.598 DEBUG 14952 --- [http-nio-9092-exec-8] c.m.m.L.selectList : ==> Preparing: SELECT aid_id,name,type,phone_number,email,avatar,address,website_url,is_emergency,description FROM legalAidResources LIMIT ? +2025-04-17 14:08:44.599 DEBUG 14952 --- [http-nio-9092-exec-8] c.m.m.L.selectList : ==> Parameters: 6(Integer) +2025-04-17 14:08:44.652 DEBUG 14952 --- [http-nio-9092-exec-8] c.m.m.L.selectList : <== Total: 6 +2025-04-17 14:10:06.803 DEBUG 14952 --- [http-nio-9092-exec-10] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM learning_resources +2025-04-17 14:10:06.804 DEBUG 14952 --- [http-nio-9092-exec-10] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 14:10:06.841 DEBUG 14952 --- [http-nio-9092-exec-10] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 14:10:06.842 DEBUG 14952 --- [http-nio-9092-exec-10] c.m.m.L.selectList : ==> Preparing: SELECT resource_id,title,type,url,duration,description FROM learning_resources LIMIT ? +2025-04-17 14:10:06.842 DEBUG 14952 --- [http-nio-9092-exec-10] c.m.m.L.selectList : ==> Parameters: 2(Integer) +2025-04-17 14:10:06.889 DEBUG 14952 --- [http-nio-9092-exec-10] c.m.m.L.selectList : <== Total: 2 +2025-04-17 14:10:10.139 DEBUG 14952 --- [http-nio-9092-exec-2] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM learning_resources +2025-04-17 14:10:10.139 DEBUG 14952 --- [http-nio-9092-exec-2] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 14:10:10.176 DEBUG 14952 --- [http-nio-9092-exec-2] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 14:10:10.177 DEBUG 14952 --- [http-nio-9092-exec-2] c.m.m.L.selectList : ==> Preparing: SELECT resource_id,title,type,url,duration,description FROM learning_resources LIMIT ? +2025-04-17 14:10:10.177 DEBUG 14952 --- [http-nio-9092-exec-2] c.m.m.L.selectList : ==> Parameters: 2(Integer) +2025-04-17 14:10:10.210 DEBUG 14952 --- [http-nio-9092-exec-2] c.m.m.L.selectList : <== Total: 2 +2025-04-17 14:10:10.632 DEBUG 14952 --- [http-nio-9092-exec-1] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM legalAidResources +2025-04-17 14:10:10.632 DEBUG 14952 --- [http-nio-9092-exec-1] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 14:10:10.674 DEBUG 14952 --- [http-nio-9092-exec-1] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 14:10:10.675 DEBUG 14952 --- [http-nio-9092-exec-1] c.m.m.L.selectList : ==> Preparing: SELECT aid_id,name,type,phone_number,email,avatar,address,website_url,is_emergency,description FROM legalAidResources LIMIT ? +2025-04-17 14:10:10.675 DEBUG 14952 --- [http-nio-9092-exec-1] c.m.m.L.selectList : ==> Parameters: 6(Integer) +2025-04-17 14:10:10.717 DEBUG 14952 --- [http-nio-9092-exec-1] c.m.m.L.selectList : <== Total: 6 +2025-04-17 14:10:11.322 DEBUG 14952 --- [http-nio-9092-exec-3] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM learning_resources +2025-04-17 14:10:11.322 DEBUG 14952 --- [http-nio-9092-exec-3] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 14:10:11.361 DEBUG 14952 --- [http-nio-9092-exec-3] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 14:10:11.362 DEBUG 14952 --- [http-nio-9092-exec-3] c.m.m.L.selectList : ==> Preparing: SELECT resource_id,title,type,url,duration,description FROM learning_resources LIMIT ? +2025-04-17 14:10:11.362 DEBUG 14952 --- [http-nio-9092-exec-3] c.m.m.L.selectList : ==> Parameters: 2(Integer) +2025-04-17 14:10:11.400 DEBUG 14952 --- [http-nio-9092-exec-3] c.m.m.L.selectList : <== Total: 2 +2025-04-17 14:10:14.340 DEBUG 14952 --- [http-nio-9092-exec-4] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM learning_resources +2025-04-17 14:10:14.341 DEBUG 14952 --- [http-nio-9092-exec-4] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 14:10:14.382 DEBUG 14952 --- [http-nio-9092-exec-4] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 14:10:14.383 DEBUG 14952 --- [http-nio-9092-exec-4] c.m.m.L.selectList : ==> Preparing: SELECT resource_id,title,type,url,duration,description FROM learning_resources LIMIT ? +2025-04-17 14:10:14.383 DEBUG 14952 --- [http-nio-9092-exec-4] c.m.m.L.selectList : ==> Parameters: 2(Integer) +2025-04-17 14:10:14.427 DEBUG 14952 --- [http-nio-9092-exec-4] c.m.m.L.selectList : <== Total: 2 +2025-04-17 14:10:14.899 DEBUG 14952 --- [http-nio-9092-exec-5] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM legalAidResources +2025-04-17 14:10:14.900 DEBUG 14952 --- [http-nio-9092-exec-5] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 14:10:14.962 DEBUG 14952 --- [http-nio-9092-exec-5] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 14:10:14.962 DEBUG 14952 --- [http-nio-9092-exec-5] c.m.m.L.selectList : ==> Preparing: SELECT aid_id,name,type,phone_number,email,avatar,address,website_url,is_emergency,description FROM legalAidResources LIMIT ? +2025-04-17 14:10:14.963 DEBUG 14952 --- [http-nio-9092-exec-5] c.m.m.L.selectList : ==> Parameters: 6(Integer) +2025-04-17 14:10:15.007 DEBUG 14952 --- [http-nio-9092-exec-5] c.m.m.L.selectList : <== Total: 6 +2025-04-17 14:10:15.336 DEBUG 14952 --- [http-nio-9092-exec-6] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM learning_resources +2025-04-17 14:10:15.337 DEBUG 14952 --- [http-nio-9092-exec-6] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 14:10:15.392 DEBUG 14952 --- [http-nio-9092-exec-6] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 14:10:15.393 DEBUG 14952 --- [http-nio-9092-exec-6] c.m.m.L.selectList : ==> Preparing: SELECT resource_id,title,type,url,duration,description FROM learning_resources LIMIT ? +2025-04-17 14:10:15.393 DEBUG 14952 --- [http-nio-9092-exec-6] c.m.m.L.selectList : ==> Parameters: 2(Integer) +2025-04-17 14:10:15.432 DEBUG 14952 --- [http-nio-9092-exec-6] c.m.m.L.selectList : <== Total: 2 +2025-04-17 14:10:16.072 DEBUG 14952 --- [http-nio-9092-exec-7] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM legalAidResources +2025-04-17 14:10:16.072 DEBUG 14952 --- [http-nio-9092-exec-7] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 14:10:16.112 DEBUG 14952 --- [http-nio-9092-exec-7] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 14:10:16.112 DEBUG 14952 --- [http-nio-9092-exec-7] c.m.m.L.selectList : ==> Preparing: SELECT aid_id,name,type,phone_number,email,avatar,address,website_url,is_emergency,description FROM legalAidResources LIMIT ? +2025-04-17 14:10:16.112 DEBUG 14952 --- [http-nio-9092-exec-7] c.m.m.L.selectList : ==> Parameters: 6(Integer) +2025-04-17 14:10:16.157 DEBUG 14952 --- [http-nio-9092-exec-7] c.m.m.L.selectList : <== Total: 6 +2025-04-17 14:10:26.821 DEBUG 14952 --- [http-nio-9092-exec-8] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM learning_resources +2025-04-17 14:10:26.821 DEBUG 14952 --- [http-nio-9092-exec-8] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 14:10:26.872 DEBUG 14952 --- [http-nio-9092-exec-8] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 14:10:26.873 DEBUG 14952 --- [http-nio-9092-exec-8] c.m.m.L.selectList : ==> Preparing: SELECT resource_id,title,type,url,duration,description FROM learning_resources LIMIT ? +2025-04-17 14:10:26.873 DEBUG 14952 --- [http-nio-9092-exec-8] c.m.m.L.selectList : ==> Parameters: 2(Integer) +2025-04-17 14:10:26.914 DEBUG 14952 --- [http-nio-9092-exec-8] c.m.m.L.selectList : <== Total: 2 +2025-04-17 14:10:31.262 DEBUG 14952 --- [http-nio-9092-exec-9] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM learning_resources +2025-04-17 14:10:31.262 DEBUG 14952 --- [http-nio-9092-exec-9] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 14:10:31.302 DEBUG 14952 --- [http-nio-9092-exec-9] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 14:10:31.303 DEBUG 14952 --- [http-nio-9092-exec-9] c.m.m.L.selectList : ==> Preparing: SELECT resource_id,title,type,url,duration,description FROM learning_resources LIMIT ? +2025-04-17 14:10:31.304 DEBUG 14952 --- [http-nio-9092-exec-9] c.m.m.L.selectList : ==> Parameters: 2(Integer) +2025-04-17 14:10:31.348 DEBUG 14952 --- [http-nio-9092-exec-9] c.m.m.L.selectList : <== Total: 2 +2025-04-17 14:10:32.039 DEBUG 14952 --- [http-nio-9092-exec-10] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM legalAidResources +2025-04-17 14:10:32.040 DEBUG 14952 --- [http-nio-9092-exec-10] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 14:10:32.081 DEBUG 14952 --- [http-nio-9092-exec-10] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 14:10:32.082 DEBUG 14952 --- [http-nio-9092-exec-10] c.m.m.L.selectList : ==> Preparing: SELECT aid_id,name,type,phone_number,email,avatar,address,website_url,is_emergency,description FROM legalAidResources LIMIT ? +2025-04-17 14:10:32.083 DEBUG 14952 --- [http-nio-9092-exec-10] c.m.m.L.selectList : ==> Parameters: 6(Integer) +2025-04-17 14:10:32.122 DEBUG 14952 --- [http-nio-9092-exec-10] c.m.m.L.selectList : <== Total: 6 +2025-04-17 14:11:04.121 DEBUG 14952 --- [http-nio-9092-exec-2] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM learning_resources +2025-04-17 14:11:04.121 DEBUG 14952 --- [http-nio-9092-exec-2] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 14:11:04.161 DEBUG 14952 --- [http-nio-9092-exec-2] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 14:11:04.162 DEBUG 14952 --- [http-nio-9092-exec-2] c.m.m.L.selectList : ==> Preparing: SELECT resource_id,title,type,url,duration,description FROM learning_resources LIMIT ? +2025-04-17 14:11:04.162 DEBUG 14952 --- [http-nio-9092-exec-2] c.m.m.L.selectList : ==> Parameters: 2(Integer) +2025-04-17 14:11:04.208 DEBUG 14952 --- [http-nio-9092-exec-2] c.m.m.L.selectList : <== Total: 2 +2025-04-17 14:11:05.122 DEBUG 14952 --- [http-nio-9092-exec-1] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM legalAidResources +2025-04-17 14:11:05.122 DEBUG 14952 --- [http-nio-9092-exec-1] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 14:11:05.160 DEBUG 14952 --- [http-nio-9092-exec-1] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 14:11:05.161 DEBUG 14952 --- [http-nio-9092-exec-1] c.m.m.L.selectList : ==> Preparing: SELECT aid_id,name,type,phone_number,email,avatar,address,website_url,is_emergency,description FROM legalAidResources LIMIT ? +2025-04-17 14:11:05.162 DEBUG 14952 --- [http-nio-9092-exec-1] c.m.m.L.selectList : ==> Parameters: 6(Integer) +2025-04-17 14:11:05.207 DEBUG 14952 --- [http-nio-9092-exec-1] c.m.m.L.selectList : <== Total: 6 +2025-04-17 14:11:21.060 DEBUG 14952 --- [http-nio-9092-exec-3] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM learning_resources +2025-04-17 14:11:21.061 DEBUG 14952 --- [http-nio-9092-exec-3] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 14:11:21.102 DEBUG 14952 --- [http-nio-9092-exec-3] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 14:11:21.102 DEBUG 14952 --- [http-nio-9092-exec-3] c.m.m.L.selectList : ==> Preparing: SELECT resource_id,title,type,url,duration,description FROM learning_resources LIMIT ? +2025-04-17 14:11:21.103 DEBUG 14952 --- [http-nio-9092-exec-3] c.m.m.L.selectList : ==> Parameters: 2(Integer) +2025-04-17 14:11:21.140 DEBUG 14952 --- [http-nio-9092-exec-3] c.m.m.L.selectList : <== Total: 2 +2025-04-17 14:11:33.480 DEBUG 14952 --- [http-nio-9092-exec-4] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM learning_resources +2025-04-17 14:11:33.480 DEBUG 14952 --- [http-nio-9092-exec-4] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 14:11:33.524 DEBUG 14952 --- [http-nio-9092-exec-4] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 14:11:33.525 DEBUG 14952 --- [http-nio-9092-exec-4] c.m.m.L.selectList : ==> Preparing: SELECT resource_id,title,type,url,duration,description FROM learning_resources LIMIT ? +2025-04-17 14:11:33.525 DEBUG 14952 --- [http-nio-9092-exec-4] c.m.m.L.selectList : ==> Parameters: 2(Integer) +2025-04-17 14:11:33.560 DEBUG 14952 --- [http-nio-9092-exec-4] c.m.m.L.selectList : <== Total: 2 +2025-04-17 14:11:34.321 DEBUG 14952 --- [http-nio-9092-exec-5] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM legalAidResources +2025-04-17 14:11:34.322 DEBUG 14952 --- [http-nio-9092-exec-5] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 14:11:34.360 DEBUG 14952 --- [http-nio-9092-exec-5] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 14:11:34.361 DEBUG 14952 --- [http-nio-9092-exec-5] c.m.m.L.selectList : ==> Preparing: SELECT aid_id,name,type,phone_number,email,avatar,address,website_url,is_emergency,description FROM legalAidResources LIMIT ? +2025-04-17 14:11:34.361 DEBUG 14952 --- [http-nio-9092-exec-5] c.m.m.L.selectList : ==> Parameters: 6(Integer) +2025-04-17 14:11:34.407 DEBUG 14952 --- [http-nio-9092-exec-5] c.m.m.L.selectList : <== Total: 6 +2025-04-17 14:12:11.081 DEBUG 14952 --- [http-nio-9092-exec-6] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM learning_resources +2025-04-17 14:12:11.082 DEBUG 14952 --- [http-nio-9092-exec-6] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 14:12:11.124 DEBUG 14952 --- [http-nio-9092-exec-6] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 14:12:11.125 DEBUG 14952 --- [http-nio-9092-exec-6] c.m.m.L.selectList : ==> Preparing: SELECT resource_id,title,type,url,duration,description FROM learning_resources LIMIT ? +2025-04-17 14:12:11.125 DEBUG 14952 --- [http-nio-9092-exec-6] c.m.m.L.selectList : ==> Parameters: 2(Integer) +2025-04-17 14:12:11.163 DEBUG 14952 --- [http-nio-9092-exec-6] c.m.m.L.selectList : <== Total: 2 +2025-04-17 14:12:13.821 DEBUG 14952 --- [http-nio-9092-exec-7] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM legalAidResources +2025-04-17 14:12:13.821 DEBUG 14952 --- [http-nio-9092-exec-7] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 14:12:13.861 DEBUG 14952 --- [http-nio-9092-exec-7] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 14:12:13.861 DEBUG 14952 --- [http-nio-9092-exec-7] c.m.m.L.selectList : ==> Preparing: SELECT aid_id,name,type,phone_number,email,avatar,address,website_url,is_emergency,description FROM legalAidResources LIMIT ? +2025-04-17 14:12:13.862 DEBUG 14952 --- [http-nio-9092-exec-7] c.m.m.L.selectList : ==> Parameters: 6(Integer) +2025-04-17 14:12:14.182 DEBUG 14952 --- [http-nio-9092-exec-7] c.m.m.L.selectList : <== Total: 6 +2025-04-17 14:12:25.764 DEBUG 14952 --- [http-nio-9092-exec-8] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM legalAidResources +2025-04-17 14:12:25.764 DEBUG 14952 --- [http-nio-9092-exec-8] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 14:12:25.802 DEBUG 14952 --- [http-nio-9092-exec-8] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 14:12:25.802 DEBUG 14952 --- [http-nio-9092-exec-8] c.m.m.L.selectList : ==> Preparing: SELECT aid_id,name,type,phone_number,email,avatar,address,website_url,is_emergency,description FROM legalAidResources LIMIT ?, ? +2025-04-17 14:12:25.803 DEBUG 14952 --- [http-nio-9092-exec-8] c.m.m.L.selectList : ==> Parameters: 6(Integer), 6(Integer) +2025-04-17 14:12:25.843 DEBUG 14952 --- [http-nio-9092-exec-8] c.m.m.L.selectList : <== Total: 6 +2025-04-17 14:12:26.940 DEBUG 14952 --- [http-nio-9092-exec-9] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM legalAidResources +2025-04-17 14:12:26.940 DEBUG 14952 --- [http-nio-9092-exec-9] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 14:12:26.981 DEBUG 14952 --- [http-nio-9092-exec-9] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 14:12:26.981 DEBUG 14952 --- [http-nio-9092-exec-9] c.m.m.L.selectList : ==> Preparing: SELECT aid_id,name,type,phone_number,email,avatar,address,website_url,is_emergency,description FROM legalAidResources LIMIT ?, ? +2025-04-17 14:12:26.982 DEBUG 14952 --- [http-nio-9092-exec-9] c.m.m.L.selectList : ==> Parameters: 12(Integer), 6(Integer) +2025-04-17 14:12:27.022 DEBUG 14952 --- [http-nio-9092-exec-9] c.m.m.L.selectList : <== Total: 2 +2025-04-17 14:20:38.816 DEBUG 14952 --- [http-nio-9092-exec-2] c.m.m.C.getAllCategoriesWithLaws : ==> Preparing: SELECT c.category_id, c.name, c.description, l.law_id, l.category_id AS law_category_id, l.title, l.summary, l.content, l.effective_date, l.reference_url FROM categories c LEFT JOIN laws l ON c.category_id = l.category_id ORDER BY c.category_id, l.law_id +2025-04-17 14:20:38.817 DEBUG 14952 --- [http-nio-9092-exec-2] c.m.m.C.getAllCategoriesWithLaws : ==> Parameters: +2025-04-17 14:20:38.869 DEBUG 14952 --- [http-nio-9092-exec-2] c.m.m.C.getAllCategoriesWithLaws : <== Total: 5 +2025-04-17 14:21:09.955 DEBUG 14952 --- [http-nio-9092-exec-1] c.m.m.C.getAllCategoriesWithLaws : ==> Preparing: SELECT c.category_id, c.name, c.description, l.law_id, l.category_id AS law_category_id, l.title, l.summary, l.content, l.effective_date, l.reference_url FROM categories c LEFT JOIN laws l ON c.category_id = l.category_id ORDER BY c.category_id, l.law_id +2025-04-17 14:21:09.955 DEBUG 14952 --- [http-nio-9092-exec-1] c.m.m.C.getAllCategoriesWithLaws : ==> Parameters: +2025-04-17 14:21:10.015 DEBUG 14952 --- [http-nio-9092-exec-1] c.m.m.C.getAllCategoriesWithLaws : <== Total: 5 +2025-04-17 14:21:16.936 DEBUG 14952 --- [http-nio-9092-exec-3] c.m.m.C.getAllCategoriesWithLaws : ==> Preparing: SELECT c.category_id, c.name, c.description, l.law_id, l.category_id AS law_category_id, l.title, l.summary, l.content, l.effective_date, l.reference_url FROM categories c LEFT JOIN laws l ON c.category_id = l.category_id ORDER BY c.category_id, l.law_id +2025-04-17 14:21:16.936 DEBUG 14952 --- [http-nio-9092-exec-3] c.m.m.C.getAllCategoriesWithLaws : ==> Parameters: +2025-04-17 14:21:16.991 DEBUG 14952 --- [http-nio-9092-exec-3] c.m.m.C.getAllCategoriesWithLaws : <== Total: 5 +2025-04-17 14:24:46.808 DEBUG 14952 --- [http-nio-9092-exec-5] c.m.m.C.getAllCategoriesWithLaws : ==> Preparing: SELECT c.category_id, c.name, c.description, l.law_id, l.category_id AS law_category_id, l.title, l.summary, l.content, l.effective_date, l.reference_url FROM categories c LEFT JOIN laws l ON c.category_id = l.category_id ORDER BY c.category_id, l.law_id +2025-04-17 14:24:46.808 DEBUG 14952 --- [http-nio-9092-exec-5] c.m.m.C.getAllCategoriesWithLaws : ==> Parameters: +2025-04-17 14:24:46.853 DEBUG 14952 --- [http-nio-9092-exec-5] c.m.m.C.getAllCategoriesWithLaws : <== Total: 5 +2025-04-17 14:24:53.113 DEBUG 14952 --- [http-nio-9092-exec-6] c.m.m.C.getAllCategoriesWithLaws : ==> Preparing: SELECT c.category_id, c.name, c.description, l.law_id, l.category_id AS law_category_id, l.title, l.summary, l.content, l.effective_date, l.reference_url FROM categories c LEFT JOIN laws l ON c.category_id = l.category_id ORDER BY c.category_id, l.law_id +2025-04-17 14:24:53.114 DEBUG 14952 --- [http-nio-9092-exec-6] c.m.m.C.getAllCategoriesWithLaws : ==> Parameters: +2025-04-17 14:24:53.174 DEBUG 14952 --- [http-nio-9092-exec-6] c.m.m.C.getAllCategoriesWithLaws : <== Total: 5 +2025-04-17 14:25:15.808 DEBUG 14952 --- [http-nio-9092-exec-7] c.m.m.C.getAllCategoriesWithLaws : ==> Preparing: SELECT c.category_id, c.name, c.description, l.law_id, l.category_id AS law_category_id, l.title, l.summary, l.content, l.effective_date, l.reference_url FROM categories c LEFT JOIN laws l ON c.category_id = l.category_id ORDER BY c.category_id, l.law_id +2025-04-17 14:25:15.808 DEBUG 14952 --- [http-nio-9092-exec-7] c.m.m.C.getAllCategoriesWithLaws : ==> Parameters: +2025-04-17 14:25:15.849 DEBUG 14952 --- [http-nio-9092-exec-7] c.m.m.C.getAllCategoriesWithLaws : <== Total: 5 +2025-04-17 14:25:23.963 DEBUG 14952 --- [http-nio-9092-exec-8] c.m.m.C.getAllCategoriesWithLaws : ==> Preparing: SELECT c.category_id, c.name, c.description, l.law_id, l.category_id AS law_category_id, l.title, l.summary, l.content, l.effective_date, l.reference_url FROM categories c LEFT JOIN laws l ON c.category_id = l.category_id ORDER BY c.category_id, l.law_id +2025-04-17 14:25:23.963 DEBUG 14952 --- [http-nio-9092-exec-8] c.m.m.C.getAllCategoriesWithLaws : ==> Parameters: +2025-04-17 14:25:24.013 DEBUG 14952 --- [http-nio-9092-exec-8] c.m.m.C.getAllCategoriesWithLaws : <== Total: 5 +2025-04-17 14:25:36.363 DEBUG 14952 --- [http-nio-9092-exec-9] c.m.m.C.getAllCategoriesWithLaws : ==> Preparing: SELECT c.category_id, c.name, c.description, l.law_id, l.category_id AS law_category_id, l.title, l.summary, l.content, l.effective_date, l.reference_url FROM categories c LEFT JOIN laws l ON c.category_id = l.category_id ORDER BY c.category_id, l.law_id +2025-04-17 14:25:36.363 DEBUG 14952 --- [http-nio-9092-exec-9] c.m.m.C.getAllCategoriesWithLaws : ==> Parameters: +2025-04-17 14:25:36.408 DEBUG 14952 --- [http-nio-9092-exec-9] c.m.m.C.getAllCategoriesWithLaws : <== Total: 5 +2025-04-17 14:25:39.804 DEBUG 14952 --- [http-nio-9092-exec-10] c.m.m.C.getAllCategoriesWithLaws : ==> Preparing: SELECT c.category_id, c.name, c.description, l.law_id, l.category_id AS law_category_id, l.title, l.summary, l.content, l.effective_date, l.reference_url FROM categories c LEFT JOIN laws l ON c.category_id = l.category_id ORDER BY c.category_id, l.law_id +2025-04-17 14:25:39.804 DEBUG 14952 --- [http-nio-9092-exec-10] c.m.m.C.getAllCategoriesWithLaws : ==> Parameters: +2025-04-17 14:25:39.860 DEBUG 14952 --- [http-nio-9092-exec-10] c.m.m.C.getAllCategoriesWithLaws : <== Total: 5 +2025-04-17 16:04:32.421 DEBUG 14952 --- [http-nio-9092-exec-3] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM legalAidResources +2025-04-17 16:04:32.422 DEBUG 14952 --- [http-nio-9092-exec-3] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 16:04:32.461 DEBUG 14952 --- [http-nio-9092-exec-3] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 16:04:32.462 DEBUG 14952 --- [http-nio-9092-exec-3] c.m.m.L.selectList : ==> Preparing: SELECT aid_id,name,type,phone_number,email,avatar,address,website_url,is_emergency,description FROM legalAidResources LIMIT ? +2025-04-17 16:04:32.462 DEBUG 14952 --- [http-nio-9092-exec-3] c.m.m.L.selectList : ==> Parameters: 6(Integer) +2025-04-17 16:04:32.507 DEBUG 14952 --- [http-nio-9092-exec-3] c.m.m.L.selectList : <== Total: 6 +2025-04-17 16:04:36.942 DEBUG 14952 --- [http-nio-9092-exec-4] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM legalAidResources +2025-04-17 16:04:36.942 DEBUG 14952 --- [http-nio-9092-exec-4] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 16:04:36.981 DEBUG 14952 --- [http-nio-9092-exec-4] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 16:04:36.982 DEBUG 14952 --- [http-nio-9092-exec-4] c.m.m.L.selectList : ==> Preparing: SELECT aid_id,name,type,phone_number,email,avatar,address,website_url,is_emergency,description FROM legalAidResources LIMIT ? +2025-04-17 16:04:36.982 DEBUG 14952 --- [http-nio-9092-exec-4] c.m.m.L.selectList : ==> Parameters: 6(Integer) +2025-04-17 16:04:37.029 DEBUG 14952 --- [http-nio-9092-exec-4] c.m.m.L.selectList : <== Total: 6 +2025-04-17 16:13:14.091 DEBUG 14952 --- [http-nio-9092-exec-7] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM learning_resources +2025-04-17 16:13:14.092 DEBUG 14952 --- [http-nio-9092-exec-7] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 16:13:14.131 DEBUG 14952 --- [http-nio-9092-exec-7] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 16:13:14.132 DEBUG 14952 --- [http-nio-9092-exec-7] c.m.m.L.selectList : ==> Preparing: SELECT resource_id,title,type,url,duration,description FROM learning_resources LIMIT ? +2025-04-17 16:13:14.132 DEBUG 14952 --- [http-nio-9092-exec-7] c.m.m.L.selectList : ==> Parameters: 2(Integer) +2025-04-17 16:13:14.182 DEBUG 14952 --- [http-nio-9092-exec-7] c.m.m.L.selectList : <== Total: 2 +2025-04-17 16:13:15.031 DEBUG 14952 --- [http-nio-9092-exec-9] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM legalAidResources +2025-04-17 16:13:15.032 DEBUG 14952 --- [http-nio-9092-exec-9] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 16:13:15.071 DEBUG 14952 --- [http-nio-9092-exec-9] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 16:13:15.071 DEBUG 14952 --- [http-nio-9092-exec-9] c.m.m.L.selectList : ==> Preparing: SELECT aid_id,name,type,phone_number,email,avatar,address,website_url,is_emergency,description FROM legalAidResources LIMIT ? +2025-04-17 16:13:15.071 DEBUG 14952 --- [http-nio-9092-exec-9] c.m.m.L.selectList : ==> Parameters: 6(Integer) +2025-04-17 16:13:15.117 DEBUG 14952 --- [http-nio-9092-exec-9] c.m.m.L.selectList : <== Total: 6 +2025-04-17 16:14:20.852 DEBUG 14952 --- [http-nio-9092-exec-1] c.m.m.C.getAllCategoriesWithLaws : ==> Preparing: SELECT c.category_id, c.name, c.description, l.law_id, l.category_id AS law_category_id, l.title, l.summary, l.content, l.effective_date, l.reference_url FROM categories c LEFT JOIN laws l ON c.category_id = l.category_id ORDER BY c.category_id, l.law_id +2025-04-17 16:14:20.852 DEBUG 14952 --- [http-nio-9092-exec-1] c.m.m.C.getAllCategoriesWithLaws : ==> Parameters: +2025-04-17 16:14:20.907 DEBUG 14952 --- [http-nio-9092-exec-1] c.m.m.C.getAllCategoriesWithLaws : <== Total: 6 +2025-04-17 16:14:37.811 DEBUG 14952 --- [http-nio-9092-exec-3] c.m.m.C.getAllCategoriesWithLaws : ==> Preparing: SELECT c.category_id, c.name, c.description, l.law_id, l.category_id AS law_category_id, l.title, l.summary, l.content, l.effective_date, l.reference_url FROM categories c LEFT JOIN laws l ON c.category_id = l.category_id ORDER BY c.category_id, l.law_id +2025-04-17 16:14:37.811 DEBUG 14952 --- [http-nio-9092-exec-3] c.m.m.C.getAllCategoriesWithLaws : ==> Parameters: +2025-04-17 16:14:37.864 DEBUG 14952 --- [http-nio-9092-exec-3] c.m.m.C.getAllCategoriesWithLaws : <== Total: 6 +2025-04-17 16:15:05.172 DEBUG 14952 --- [http-nio-9092-exec-4] c.m.m.C.getAllCategoriesWithLaws : ==> Preparing: SELECT c.category_id, c.name, c.description, l.law_id, l.category_id AS law_category_id, l.title, l.summary, l.content, l.effective_date, l.reference_url FROM categories c LEFT JOIN laws l ON c.category_id = l.category_id ORDER BY c.category_id, l.law_id +2025-04-17 16:15:05.172 DEBUG 14952 --- [http-nio-9092-exec-4] c.m.m.C.getAllCategoriesWithLaws : ==> Parameters: +2025-04-17 16:15:05.227 DEBUG 14952 --- [http-nio-9092-exec-4] c.m.m.C.getAllCategoriesWithLaws : <== Total: 6 +2025-04-17 16:15:17.792 DEBUG 14952 --- [http-nio-9092-exec-5] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM learning_resources +2025-04-17 16:15:17.793 DEBUG 14952 --- [http-nio-9092-exec-5] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 16:15:17.836 DEBUG 14952 --- [http-nio-9092-exec-5] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 16:15:17.836 DEBUG 14952 --- [http-nio-9092-exec-5] c.m.m.L.selectList : ==> Preparing: SELECT resource_id,title,type,url,duration,description FROM learning_resources LIMIT ? +2025-04-17 16:15:17.836 DEBUG 14952 --- [http-nio-9092-exec-5] c.m.m.L.selectList : ==> Parameters: 2(Integer) +2025-04-17 16:15:17.878 DEBUG 14952 --- [http-nio-9092-exec-5] c.m.m.L.selectList : <== Total: 2 +2025-04-17 16:15:18.307 DEBUG 14952 --- [http-nio-9092-exec-6] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM legalAidResources +2025-04-17 16:15:18.307 DEBUG 14952 --- [http-nio-9092-exec-6] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 16:15:18.377 DEBUG 14952 --- [http-nio-9092-exec-6] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 16:15:18.377 DEBUG 14952 --- [http-nio-9092-exec-6] c.m.m.L.selectList : ==> Preparing: SELECT aid_id,name,type,phone_number,email,avatar,address,website_url,is_emergency,description FROM legalAidResources LIMIT ? +2025-04-17 16:15:18.377 DEBUG 14952 --- [http-nio-9092-exec-6] c.m.m.L.selectList : ==> Parameters: 6(Integer) +2025-04-17 16:15:18.416 DEBUG 14952 --- [http-nio-9092-exec-6] c.m.m.L.selectList : <== Total: 6 +2025-04-17 16:15:18.709 DEBUG 14952 --- [http-nio-9092-exec-7] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM learning_resources +2025-04-17 16:15:18.710 DEBUG 14952 --- [http-nio-9092-exec-7] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 16:15:18.753 DEBUG 14952 --- [http-nio-9092-exec-7] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 16:15:18.754 DEBUG 14952 --- [http-nio-9092-exec-7] c.m.m.L.selectList : ==> Preparing: SELECT resource_id,title,type,url,duration,description FROM learning_resources LIMIT ? +2025-04-17 16:15:18.754 DEBUG 14952 --- [http-nio-9092-exec-7] c.m.m.L.selectList : ==> Parameters: 2(Integer) +2025-04-17 16:15:18.791 DEBUG 14952 --- [http-nio-9092-exec-7] c.m.m.L.selectList : <== Total: 2 +2025-04-17 16:15:19.141 DEBUG 14952 --- [http-nio-9092-exec-8] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM legalAidResources +2025-04-17 16:15:19.141 DEBUG 14952 --- [http-nio-9092-exec-8] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 16:15:19.192 DEBUG 14952 --- [http-nio-9092-exec-8] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 16:15:19.192 DEBUG 14952 --- [http-nio-9092-exec-8] c.m.m.L.selectList : ==> Preparing: SELECT aid_id,name,type,phone_number,email,avatar,address,website_url,is_emergency,description FROM legalAidResources LIMIT ? +2025-04-17 16:15:19.192 DEBUG 14952 --- [http-nio-9092-exec-8] c.m.m.L.selectList : ==> Parameters: 6(Integer) +2025-04-17 16:15:19.240 DEBUG 14952 --- [http-nio-9092-exec-8] c.m.m.L.selectList : <== Total: 6 +2025-04-17 16:15:19.536 DEBUG 14952 --- [http-nio-9092-exec-9] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM learning_resources +2025-04-17 16:15:19.536 DEBUG 14952 --- [http-nio-9092-exec-9] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 16:15:19.591 DEBUG 14952 --- [http-nio-9092-exec-9] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 16:15:19.592 DEBUG 14952 --- [http-nio-9092-exec-9] c.m.m.L.selectList : ==> Preparing: SELECT resource_id,title,type,url,duration,description FROM learning_resources LIMIT ? +2025-04-17 16:15:19.592 DEBUG 14952 --- [http-nio-9092-exec-9] c.m.m.L.selectList : ==> Parameters: 2(Integer) +2025-04-17 16:15:19.636 DEBUG 14952 --- [http-nio-9092-exec-9] c.m.m.L.selectList : <== Total: 2 +2025-04-17 16:15:19.954 DEBUG 14952 --- [http-nio-9092-exec-10] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM legalAidResources +2025-04-17 16:15:19.954 DEBUG 14952 --- [http-nio-9092-exec-10] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 16:15:19.996 DEBUG 14952 --- [http-nio-9092-exec-10] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 16:15:19.997 DEBUG 14952 --- [http-nio-9092-exec-10] c.m.m.L.selectList : ==> Preparing: SELECT aid_id,name,type,phone_number,email,avatar,address,website_url,is_emergency,description FROM legalAidResources LIMIT ? +2025-04-17 16:15:19.997 DEBUG 14952 --- [http-nio-9092-exec-10] c.m.m.L.selectList : ==> Parameters: 6(Integer) +2025-04-17 16:15:20.040 DEBUG 14952 --- [http-nio-9092-exec-10] c.m.m.L.selectList : <== Total: 6 +2025-04-17 16:15:20.317 DEBUG 14952 --- [http-nio-9092-exec-2] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM learning_resources +2025-04-17 16:15:20.318 DEBUG 14952 --- [http-nio-9092-exec-2] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 16:15:20.373 DEBUG 14952 --- [http-nio-9092-exec-2] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 16:15:20.374 DEBUG 14952 --- [http-nio-9092-exec-2] c.m.m.L.selectList : ==> Preparing: SELECT resource_id,title,type,url,duration,description FROM learning_resources LIMIT ? +2025-04-17 16:15:20.374 DEBUG 14952 --- [http-nio-9092-exec-2] c.m.m.L.selectList : ==> Parameters: 2(Integer) +2025-04-17 16:15:20.418 DEBUG 14952 --- [http-nio-9092-exec-2] c.m.m.L.selectList : <== Total: 2 +2025-04-17 16:15:20.695 DEBUG 14952 --- [http-nio-9092-exec-1] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM legalAidResources +2025-04-17 16:15:20.695 DEBUG 14952 --- [http-nio-9092-exec-1] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 16:15:20.751 DEBUG 14952 --- [http-nio-9092-exec-1] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 16:15:20.752 DEBUG 14952 --- [http-nio-9092-exec-1] c.m.m.L.selectList : ==> Preparing: SELECT aid_id,name,type,phone_number,email,avatar,address,website_url,is_emergency,description FROM legalAidResources LIMIT ? +2025-04-17 16:15:20.752 DEBUG 14952 --- [http-nio-9092-exec-1] c.m.m.L.selectList : ==> Parameters: 6(Integer) +2025-04-17 16:15:20.796 DEBUG 14952 --- [http-nio-9092-exec-1] c.m.m.L.selectList : <== Total: 6 +2025-04-17 16:16:18.232 DEBUG 14952 --- [http-nio-9092-exec-3] c.m.m.C.getAllCategoriesWithLaws : ==> Preparing: SELECT c.category_id, c.name, c.description, l.law_id, l.category_id AS law_category_id, l.title, l.summary, l.content, l.effective_date, l.reference_url FROM categories c LEFT JOIN laws l ON c.category_id = l.category_id ORDER BY c.category_id, l.law_id +2025-04-17 16:16:18.232 DEBUG 14952 --- [http-nio-9092-exec-3] c.m.m.C.getAllCategoriesWithLaws : ==> Parameters: +2025-04-17 16:16:18.282 DEBUG 14952 --- [http-nio-9092-exec-3] c.m.m.C.getAllCategoriesWithLaws : <== Total: 6 +2025-04-17 16:16:29.492 DEBUG 14952 --- [http-nio-9092-exec-4] c.m.m.C.getAllCategoriesWithLaws : ==> Preparing: SELECT c.category_id, c.name, c.description, l.law_id, l.category_id AS law_category_id, l.title, l.summary, l.content, l.effective_date, l.reference_url FROM categories c LEFT JOIN laws l ON c.category_id = l.category_id ORDER BY c.category_id, l.law_id +2025-04-17 16:16:29.492 DEBUG 14952 --- [http-nio-9092-exec-4] c.m.m.C.getAllCategoriesWithLaws : ==> Parameters: +2025-04-17 16:16:29.548 DEBUG 14952 --- [http-nio-9092-exec-4] c.m.m.C.getAllCategoriesWithLaws : <== Total: 6 +2025-04-17 16:17:07.171 DEBUG 14952 --- [http-nio-9092-exec-5] c.m.m.C.getAllCategoriesWithLaws : ==> Preparing: SELECT c.category_id, c.name, c.description, l.law_id, l.category_id AS law_category_id, l.title, l.summary, l.content, l.effective_date, l.reference_url FROM categories c LEFT JOIN laws l ON c.category_id = l.category_id ORDER BY c.category_id, l.law_id +2025-04-17 16:17:07.171 DEBUG 14952 --- [http-nio-9092-exec-5] c.m.m.C.getAllCategoriesWithLaws : ==> Parameters: +2025-04-17 16:17:07.226 DEBUG 14952 --- [http-nio-9092-exec-5] c.m.m.C.getAllCategoriesWithLaws : <== Total: 6 +2025-04-17 16:17:08.412 DEBUG 14952 --- [http-nio-9092-exec-6] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM legalAidResources +2025-04-17 16:17:08.412 DEBUG 14952 --- [http-nio-9092-exec-6] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 16:17:08.452 DEBUG 14952 --- [http-nio-9092-exec-6] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 16:17:08.452 DEBUG 14952 --- [http-nio-9092-exec-6] c.m.m.L.selectList : ==> Preparing: SELECT aid_id,name,type,phone_number,email,avatar,address,website_url,is_emergency,description FROM legalAidResources LIMIT ? +2025-04-17 16:17:08.452 DEBUG 14952 --- [http-nio-9092-exec-6] c.m.m.L.selectList : ==> Parameters: 6(Integer) +2025-04-17 16:17:08.492 DEBUG 14952 --- [http-nio-9092-exec-6] c.m.m.L.selectList : <== Total: 6 +2025-04-17 16:17:14.712 DEBUG 14952 --- [http-nio-9092-exec-7] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM legalAidResources +2025-04-17 16:17:14.712 DEBUG 14952 --- [http-nio-9092-exec-7] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 16:17:14.751 DEBUG 14952 --- [http-nio-9092-exec-7] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 16:17:14.751 DEBUG 14952 --- [http-nio-9092-exec-7] c.m.m.L.selectList : ==> Preparing: SELECT aid_id,name,type,phone_number,email,avatar,address,website_url,is_emergency,description FROM legalAidResources LIMIT ? +2025-04-17 16:17:14.751 DEBUG 14952 --- [http-nio-9092-exec-7] c.m.m.L.selectList : ==> Parameters: 6(Integer) +2025-04-17 16:17:14.792 DEBUG 14952 --- [http-nio-9092-exec-7] c.m.m.L.selectList : <== Total: 6 +2025-04-17 16:18:00.031 DEBUG 14952 --- [http-nio-9092-exec-8] c.m.m.C.getAllCategoriesWithLaws : ==> Preparing: SELECT c.category_id, c.name, c.description, l.law_id, l.category_id AS law_category_id, l.title, l.summary, l.content, l.effective_date, l.reference_url FROM categories c LEFT JOIN laws l ON c.category_id = l.category_id ORDER BY c.category_id, l.law_id +2025-04-17 16:18:00.031 DEBUG 14952 --- [http-nio-9092-exec-8] c.m.m.C.getAllCategoriesWithLaws : ==> Parameters: +2025-04-17 16:18:00.102 DEBUG 14952 --- [http-nio-9092-exec-8] c.m.m.C.getAllCategoriesWithLaws : <== Total: 6 +2025-04-17 16:18:04.692 DEBUG 14952 --- [http-nio-9092-exec-9] c.m.m.C.getAllCategoriesWithLaws : ==> Preparing: SELECT c.category_id, c.name, c.description, l.law_id, l.category_id AS law_category_id, l.title, l.summary, l.content, l.effective_date, l.reference_url FROM categories c LEFT JOIN laws l ON c.category_id = l.category_id ORDER BY c.category_id, l.law_id +2025-04-17 16:18:04.692 DEBUG 14952 --- [http-nio-9092-exec-9] c.m.m.C.getAllCategoriesWithLaws : ==> Parameters: +2025-04-17 16:18:04.746 DEBUG 14952 --- [http-nio-9092-exec-9] c.m.m.C.getAllCategoriesWithLaws : <== Total: 6 +2025-04-17 16:18:19.651 DEBUG 14952 --- [http-nio-9092-exec-10] c.m.m.C.getAllCategoriesWithLaws : ==> Preparing: SELECT c.category_id, c.name, c.description, l.law_id, l.category_id AS law_category_id, l.title, l.summary, l.content, l.effective_date, l.reference_url FROM categories c LEFT JOIN laws l ON c.category_id = l.category_id ORDER BY c.category_id, l.law_id +2025-04-17 16:18:19.651 DEBUG 14952 --- [http-nio-9092-exec-10] c.m.m.C.getAllCategoriesWithLaws : ==> Parameters: +2025-04-17 16:18:19.711 DEBUG 14952 --- [http-nio-9092-exec-10] c.m.m.C.getAllCategoriesWithLaws : <== Total: 6 +2025-04-17 16:19:10.414 DEBUG 14952 --- [http-nio-9092-exec-2] c.m.m.C.getAllCategoriesWithLaws : ==> Preparing: SELECT c.category_id, c.name, c.description, l.law_id, l.category_id AS law_category_id, l.title, l.summary, l.content, l.effective_date, l.reference_url FROM categories c LEFT JOIN laws l ON c.category_id = l.category_id ORDER BY c.category_id, l.law_id +2025-04-17 16:19:10.415 DEBUG 14952 --- [http-nio-9092-exec-2] c.m.m.C.getAllCategoriesWithLaws : ==> Parameters: +2025-04-17 16:19:10.465 DEBUG 14952 --- [http-nio-9092-exec-2] c.m.m.C.getAllCategoriesWithLaws : <== Total: 6 +2025-04-17 16:19:10.828 DEBUG 14952 --- [http-nio-9092-exec-1] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM legalAidResources +2025-04-17 16:19:10.829 DEBUG 14952 --- [http-nio-9092-exec-1] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 16:19:10.874 DEBUG 14952 --- [http-nio-9092-exec-1] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 16:19:10.874 DEBUG 14952 --- [http-nio-9092-exec-1] c.m.m.L.selectList : ==> Preparing: SELECT aid_id,name,type,phone_number,email,avatar,address,website_url,is_emergency,description FROM legalAidResources LIMIT ? +2025-04-17 16:19:10.875 DEBUG 14952 --- [http-nio-9092-exec-1] c.m.m.L.selectList : ==> Parameters: 6(Integer) +2025-04-17 16:19:10.912 DEBUG 14952 --- [http-nio-9092-exec-1] c.m.m.L.selectList : <== Total: 6 +2025-04-17 16:20:51.011 DEBUG 14952 --- [http-nio-9092-exec-4] c.m.m.C.getAllCategoriesWithLaws : ==> Preparing: SELECT c.category_id, c.name, c.description, l.law_id, l.category_id AS law_category_id, l.title, l.summary, l.content, l.effective_date, l.reference_url FROM categories c LEFT JOIN laws l ON c.category_id = l.category_id ORDER BY c.category_id, l.law_id +2025-04-17 16:20:51.011 DEBUG 14952 --- [http-nio-9092-exec-4] c.m.m.C.getAllCategoriesWithLaws : ==> Parameters: +2025-04-17 16:20:51.062 DEBUG 14952 --- [http-nio-9092-exec-4] c.m.m.C.getAllCategoriesWithLaws : <== Total: 6 +2025-04-17 16:20:52.446 DEBUG 14952 --- [http-nio-9092-exec-5] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM legalAidResources +2025-04-17 16:20:52.446 DEBUG 14952 --- [http-nio-9092-exec-5] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 16:20:52.487 DEBUG 14952 --- [http-nio-9092-exec-5] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 16:20:52.487 DEBUG 14952 --- [http-nio-9092-exec-5] c.m.m.L.selectList : ==> Preparing: SELECT aid_id,name,type,phone_number,email,avatar,address,website_url,is_emergency,description FROM legalAidResources LIMIT ? +2025-04-17 16:20:52.487 DEBUG 14952 --- [http-nio-9092-exec-5] c.m.m.L.selectList : ==> Parameters: 6(Integer) +2025-04-17 16:20:52.534 DEBUG 14952 --- [http-nio-9092-exec-5] c.m.m.L.selectList : <== Total: 6 +2025-04-17 16:21:55.114 DEBUG 14952 --- [http-nio-9092-exec-7] c.m.m.C.getAllCategoriesWithLaws : ==> Preparing: SELECT c.category_id, c.name, c.description, l.law_id, l.category_id AS law_category_id, l.title, l.summary, l.content, l.effective_date, l.reference_url FROM categories c LEFT JOIN laws l ON c.category_id = l.category_id ORDER BY c.category_id, l.law_id +2025-04-17 16:21:55.114 DEBUG 14952 --- [http-nio-9092-exec-7] c.m.m.C.getAllCategoriesWithLaws : ==> Parameters: +2025-04-17 16:21:55.165 DEBUG 14952 --- [http-nio-9092-exec-7] c.m.m.C.getAllCategoriesWithLaws : <== Total: 6 +2025-04-17 16:21:57.380 DEBUG 14952 --- [http-nio-9092-exec-8] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM legalAidResources +2025-04-17 16:21:57.380 DEBUG 14952 --- [http-nio-9092-exec-8] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 16:21:57.416 DEBUG 14952 --- [http-nio-9092-exec-8] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 16:21:57.417 DEBUG 14952 --- [http-nio-9092-exec-8] c.m.m.L.selectList : ==> Preparing: SELECT aid_id,name,type,phone_number,email,avatar,address,website_url,is_emergency,description FROM legalAidResources LIMIT ? +2025-04-17 16:21:57.417 DEBUG 14952 --- [http-nio-9092-exec-8] c.m.m.L.selectList : ==> Parameters: 6(Integer) +2025-04-17 16:21:57.456 DEBUG 14952 --- [http-nio-9092-exec-8] c.m.m.L.selectList : <== Total: 6 +2025-04-17 16:24:13.638 DEBUG 14952 --- [http-nio-9092-exec-10] c.m.m.C.getAllCategoriesWithLaws : ==> Preparing: SELECT c.category_id, c.name, c.description, l.law_id, l.category_id AS law_category_id, l.title, l.summary, l.content, l.effective_date, l.reference_url FROM categories c LEFT JOIN laws l ON c.category_id = l.category_id ORDER BY c.category_id, l.law_id +2025-04-17 16:24:13.639 DEBUG 14952 --- [http-nio-9092-exec-10] c.m.m.C.getAllCategoriesWithLaws : ==> Parameters: +2025-04-17 16:24:13.696 DEBUG 14952 --- [http-nio-9092-exec-10] c.m.m.C.getAllCategoriesWithLaws : <== Total: 6 +2025-04-17 16:24:39.379 DEBUG 14952 --- [http-nio-9092-exec-2] c.m.m.C.getAllCategoriesWithLaws : ==> Preparing: SELECT c.category_id, c.name, c.description, l.law_id, l.category_id AS law_category_id, l.title, l.summary, l.content, l.effective_date, l.reference_url FROM categories c LEFT JOIN laws l ON c.category_id = l.category_id ORDER BY c.category_id, l.law_id +2025-04-17 16:24:39.379 DEBUG 14952 --- [http-nio-9092-exec-2] c.m.m.C.getAllCategoriesWithLaws : ==> Parameters: +2025-04-17 16:24:39.429 DEBUG 14952 --- [http-nio-9092-exec-2] c.m.m.C.getAllCategoriesWithLaws : <== Total: 6 +2025-04-17 16:24:39.849 DEBUG 14952 --- [http-nio-9092-exec-1] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM legalAidResources +2025-04-17 16:24:39.849 DEBUG 14952 --- [http-nio-9092-exec-1] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 16:24:39.880 DEBUG 14952 --- [http-nio-9092-exec-1] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 16:24:39.880 DEBUG 14952 --- [http-nio-9092-exec-1] c.m.m.L.selectList : ==> Preparing: SELECT aid_id,name,type,phone_number,email,avatar,address,website_url,is_emergency,description FROM legalAidResources LIMIT ? +2025-04-17 16:24:39.881 DEBUG 14952 --- [http-nio-9092-exec-1] c.m.m.L.selectList : ==> Parameters: 6(Integer) +2025-04-17 16:24:39.920 DEBUG 14952 --- [http-nio-9092-exec-1] c.m.m.L.selectList : <== Total: 6 +2025-04-17 16:25:44.338 DEBUG 14952 --- [http-nio-9092-exec-4] c.m.m.C.getAllCategoriesWithLaws : ==> Preparing: SELECT c.category_id, c.name, c.description, l.law_id, l.category_id AS law_category_id, l.title, l.summary, l.content, l.effective_date, l.reference_url FROM categories c LEFT JOIN laws l ON c.category_id = l.category_id ORDER BY c.category_id, l.law_id +2025-04-17 16:25:44.338 DEBUG 14952 --- [http-nio-9092-exec-4] c.m.m.C.getAllCategoriesWithLaws : ==> Parameters: +2025-04-17 16:25:44.386 DEBUG 14952 --- [http-nio-9092-exec-4] c.m.m.C.getAllCategoriesWithLaws : <== Total: 6 +2025-04-17 16:25:49.278 DEBUG 14952 --- [http-nio-9092-exec-5] c.m.m.C.getAllCategoriesWithLaws : ==> Preparing: SELECT c.category_id, c.name, c.description, l.law_id, l.category_id AS law_category_id, l.title, l.summary, l.content, l.effective_date, l.reference_url FROM categories c LEFT JOIN laws l ON c.category_id = l.category_id ORDER BY c.category_id, l.law_id +2025-04-17 16:25:49.279 DEBUG 14952 --- [http-nio-9092-exec-5] c.m.m.C.getAllCategoriesWithLaws : ==> Parameters: +2025-04-17 16:25:49.340 DEBUG 14952 --- [http-nio-9092-exec-5] c.m.m.C.getAllCategoriesWithLaws : <== Total: 6 +2025-04-17 16:25:59.458 DEBUG 14952 --- [http-nio-9092-exec-6] c.m.m.C.getAllCategoriesWithLaws : ==> Preparing: SELECT c.category_id, c.name, c.description, l.law_id, l.category_id AS law_category_id, l.title, l.summary, l.content, l.effective_date, l.reference_url FROM categories c LEFT JOIN laws l ON c.category_id = l.category_id ORDER BY c.category_id, l.law_id +2025-04-17 16:25:59.459 DEBUG 14952 --- [http-nio-9092-exec-6] c.m.m.C.getAllCategoriesWithLaws : ==> Parameters: +2025-04-17 16:25:59.509 DEBUG 14952 --- [http-nio-9092-exec-6] c.m.m.C.getAllCategoriesWithLaws : <== Total: 6 +2025-04-17 16:26:26.460 DEBUG 14952 --- [http-nio-9092-exec-7] c.m.m.C.getAllCategoriesWithLaws : ==> Preparing: SELECT c.category_id, c.name, c.description, l.law_id, l.category_id AS law_category_id, l.title, l.summary, l.content, l.effective_date, l.reference_url FROM categories c LEFT JOIN laws l ON c.category_id = l.category_id ORDER BY c.category_id, l.law_id +2025-04-17 16:26:26.461 DEBUG 14952 --- [http-nio-9092-exec-7] c.m.m.C.getAllCategoriesWithLaws : ==> Parameters: +2025-04-17 16:26:26.509 DEBUG 14952 --- [http-nio-9092-exec-7] c.m.m.C.getAllCategoriesWithLaws : <== Total: 6 +2025-04-17 16:26:29.740 DEBUG 14952 --- [http-nio-9092-exec-8] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM legalAidResources +2025-04-17 16:26:29.740 DEBUG 14952 --- [http-nio-9092-exec-8] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 16:26:29.784 DEBUG 14952 --- [http-nio-9092-exec-8] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 16:26:29.785 DEBUG 14952 --- [http-nio-9092-exec-8] c.m.m.L.selectList : ==> Preparing: SELECT aid_id,name,type,phone_number,email,avatar,address,website_url,is_emergency,description FROM legalAidResources LIMIT ? +2025-04-17 16:26:29.785 DEBUG 14952 --- [http-nio-9092-exec-8] c.m.m.L.selectList : ==> Parameters: 6(Integer) +2025-04-17 16:26:29.820 DEBUG 14952 --- [http-nio-9092-exec-8] c.m.m.L.selectList : <== Total: 6 +2025-04-17 16:27:59.539 DEBUG 14952 --- [http-nio-9092-exec-10] c.m.m.C.getAllCategoriesWithLaws : ==> Preparing: SELECT c.category_id, c.name, c.description, l.law_id, l.category_id AS law_category_id, l.title, l.summary, l.content, l.effective_date, l.reference_url FROM categories c LEFT JOIN laws l ON c.category_id = l.category_id ORDER BY c.category_id, l.law_id +2025-04-17 16:27:59.540 DEBUG 14952 --- [http-nio-9092-exec-10] c.m.m.C.getAllCategoriesWithLaws : ==> Parameters: +2025-04-17 16:27:59.712 DEBUG 14952 --- [http-nio-9092-exec-10] c.m.m.C.getAllCategoriesWithLaws : <== Total: 6 +2025-04-17 16:28:06.840 DEBUG 14952 --- [http-nio-9092-exec-2] c.m.m.C.getAllCategoriesWithLaws : ==> Preparing: SELECT c.category_id, c.name, c.description, l.law_id, l.category_id AS law_category_id, l.title, l.summary, l.content, l.effective_date, l.reference_url FROM categories c LEFT JOIN laws l ON c.category_id = l.category_id ORDER BY c.category_id, l.law_id +2025-04-17 16:28:06.840 DEBUG 14952 --- [http-nio-9092-exec-2] c.m.m.C.getAllCategoriesWithLaws : ==> Parameters: +2025-04-17 16:28:06.890 DEBUG 14952 --- [http-nio-9092-exec-2] c.m.m.C.getAllCategoriesWithLaws : <== Total: 6 +2025-04-17 16:28:14.461 DEBUG 14952 --- [http-nio-9092-exec-1] c.m.m.C.getAllCategoriesWithLaws : ==> Preparing: SELECT c.category_id, c.name, c.description, l.law_id, l.category_id AS law_category_id, l.title, l.summary, l.content, l.effective_date, l.reference_url FROM categories c LEFT JOIN laws l ON c.category_id = l.category_id ORDER BY c.category_id, l.law_id +2025-04-17 16:28:14.461 DEBUG 14952 --- [http-nio-9092-exec-1] c.m.m.C.getAllCategoriesWithLaws : ==> Parameters: +2025-04-17 16:28:14.507 DEBUG 14952 --- [http-nio-9092-exec-1] c.m.m.C.getAllCategoriesWithLaws : <== Total: 6 +2025-04-17 16:28:25.398 DEBUG 14952 --- [http-nio-9092-exec-3] c.m.m.C.getAllCategoriesWithLaws : ==> Preparing: SELECT c.category_id, c.name, c.description, l.law_id, l.category_id AS law_category_id, l.title, l.summary, l.content, l.effective_date, l.reference_url FROM categories c LEFT JOIN laws l ON c.category_id = l.category_id ORDER BY c.category_id, l.law_id +2025-04-17 16:28:25.398 DEBUG 14952 --- [http-nio-9092-exec-3] c.m.m.C.getAllCategoriesWithLaws : ==> Parameters: +2025-04-17 16:28:25.448 DEBUG 14952 --- [http-nio-9092-exec-3] c.m.m.C.getAllCategoriesWithLaws : <== Total: 6 +2025-04-17 16:28:47.182 DEBUG 14952 --- [http-nio-9092-exec-4] c.m.m.C.getAllCategoriesWithLaws : ==> Preparing: SELECT c.category_id, c.name, c.description, l.law_id, l.category_id AS law_category_id, l.title, l.summary, l.content, l.effective_date, l.reference_url FROM categories c LEFT JOIN laws l ON c.category_id = l.category_id ORDER BY c.category_id, l.law_id +2025-04-17 16:28:47.183 DEBUG 14952 --- [http-nio-9092-exec-4] c.m.m.C.getAllCategoriesWithLaws : ==> Parameters: +2025-04-17 16:28:47.230 DEBUG 14952 --- [http-nio-9092-exec-4] c.m.m.C.getAllCategoriesWithLaws : <== Total: 6 +2025-04-17 16:28:47.624 DEBUG 14952 --- [http-nio-9092-exec-5] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM legalAidResources +2025-04-17 16:28:47.624 DEBUG 14952 --- [http-nio-9092-exec-5] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 16:28:47.690 DEBUG 14952 --- [http-nio-9092-exec-5] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 16:28:47.690 DEBUG 14952 --- [http-nio-9092-exec-5] c.m.m.L.selectList : ==> Preparing: SELECT aid_id,name,type,phone_number,email,avatar,address,website_url,is_emergency,description FROM legalAidResources LIMIT ? +2025-04-17 16:28:47.690 DEBUG 14952 --- [http-nio-9092-exec-5] c.m.m.L.selectList : ==> Parameters: 6(Integer) +2025-04-17 16:28:47.728 DEBUG 14952 --- [http-nio-9092-exec-5] c.m.m.L.selectList : <== Total: 6 +2025-04-17 16:28:57.182 DEBUG 14952 --- [http-nio-9092-exec-6] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM learning_resources +2025-04-17 16:28:57.183 DEBUG 14952 --- [http-nio-9092-exec-6] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 16:28:57.222 DEBUG 14952 --- [http-nio-9092-exec-6] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 16:28:57.222 DEBUG 14952 --- [http-nio-9092-exec-6] c.m.m.L.selectList : ==> Preparing: SELECT resource_id,title,type,url,duration,description FROM learning_resources LIMIT ? +2025-04-17 16:28:57.223 DEBUG 14952 --- [http-nio-9092-exec-6] c.m.m.L.selectList : ==> Parameters: 2(Integer) +2025-04-17 16:28:57.263 DEBUG 14952 --- [http-nio-9092-exec-6] c.m.m.L.selectList : <== Total: 2 +2025-04-17 16:28:59.845 DEBUG 14952 --- [http-nio-9092-exec-7] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM legalAidResources +2025-04-17 16:28:59.845 DEBUG 14952 --- [http-nio-9092-exec-7] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 16:28:59.880 DEBUG 14952 --- [http-nio-9092-exec-7] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 16:28:59.881 DEBUG 14952 --- [http-nio-9092-exec-7] c.m.m.L.selectList : ==> Preparing: SELECT aid_id,name,type,phone_number,email,avatar,address,website_url,is_emergency,description FROM legalAidResources LIMIT ? +2025-04-17 16:28:59.881 DEBUG 14952 --- [http-nio-9092-exec-7] c.m.m.L.selectList : ==> Parameters: 6(Integer) +2025-04-17 16:28:59.921 DEBUG 14952 --- [http-nio-9092-exec-7] c.m.m.L.selectList : <== Total: 6 +2025-04-17 16:29:02.960 DEBUG 14952 --- [http-nio-9092-exec-8] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM learning_resources +2025-04-17 16:29:02.960 DEBUG 14952 --- [http-nio-9092-exec-8] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 16:29:03.000 DEBUG 14952 --- [http-nio-9092-exec-8] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 16:29:03.000 DEBUG 14952 --- [http-nio-9092-exec-8] c.m.m.L.selectList : ==> Preparing: SELECT resource_id,title,type,url,duration,description FROM learning_resources LIMIT ? +2025-04-17 16:29:03.001 DEBUG 14952 --- [http-nio-9092-exec-8] c.m.m.L.selectList : ==> Parameters: 2(Integer) +2025-04-17 16:29:03.040 DEBUG 14952 --- [http-nio-9092-exec-8] c.m.m.L.selectList : <== Total: 2 +2025-04-17 16:29:03.819 DEBUG 14952 --- [http-nio-9092-exec-9] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM legalAidResources +2025-04-17 16:29:03.820 DEBUG 14952 --- [http-nio-9092-exec-9] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 16:29:03.860 DEBUG 14952 --- [http-nio-9092-exec-9] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 16:29:03.860 DEBUG 14952 --- [http-nio-9092-exec-9] c.m.m.L.selectList : ==> Preparing: SELECT aid_id,name,type,phone_number,email,avatar,address,website_url,is_emergency,description FROM legalAidResources LIMIT ? +2025-04-17 16:29:03.861 DEBUG 14952 --- [http-nio-9092-exec-9] c.m.m.L.selectList : ==> Parameters: 6(Integer) +2025-04-17 16:29:03.901 DEBUG 14952 --- [http-nio-9092-exec-9] c.m.m.L.selectList : <== Total: 6 +2025-04-17 16:29:04.348 DEBUG 14952 --- [http-nio-9092-exec-10] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM learning_resources +2025-04-17 16:29:04.348 DEBUG 14952 --- [http-nio-9092-exec-10] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 16:29:04.381 DEBUG 14952 --- [http-nio-9092-exec-10] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 16:29:04.381 DEBUG 14952 --- [http-nio-9092-exec-10] c.m.m.L.selectList : ==> Preparing: SELECT resource_id,title,type,url,duration,description FROM learning_resources LIMIT ? +2025-04-17 16:29:04.381 DEBUG 14952 --- [http-nio-9092-exec-10] c.m.m.L.selectList : ==> Parameters: 2(Integer) +2025-04-17 16:29:04.420 DEBUG 14952 --- [http-nio-9092-exec-10] c.m.m.L.selectList : <== Total: 2 +2025-04-17 16:29:21.640 DEBUG 14952 --- [http-nio-9092-exec-2] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM legalAidResources +2025-04-17 16:29:21.641 DEBUG 14952 --- [http-nio-9092-exec-2] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 16:29:21.682 DEBUG 14952 --- [http-nio-9092-exec-2] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 16:29:21.683 DEBUG 14952 --- [http-nio-9092-exec-2] c.m.m.L.selectList : ==> Preparing: SELECT aid_id,name,type,phone_number,email,avatar,address,website_url,is_emergency,description FROM legalAidResources LIMIT ? +2025-04-17 16:29:21.683 DEBUG 14952 --- [http-nio-9092-exec-2] c.m.m.L.selectList : ==> Parameters: 6(Integer) +2025-04-17 16:29:21.728 DEBUG 14952 --- [http-nio-9092-exec-2] c.m.m.L.selectList : <== Total: 6 +2025-04-17 16:29:34.335 DEBUG 14952 --- [http-nio-9092-exec-1] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM learning_resources +2025-04-17 16:29:34.336 DEBUG 14952 --- [http-nio-9092-exec-1] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 16:29:34.375 DEBUG 14952 --- [http-nio-9092-exec-1] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 16:29:34.376 DEBUG 14952 --- [http-nio-9092-exec-1] c.m.m.L.selectList : ==> Preparing: SELECT resource_id,title,type,url,duration,description FROM learning_resources LIMIT ? +2025-04-17 16:29:34.376 DEBUG 14952 --- [http-nio-9092-exec-1] c.m.m.L.selectList : ==> Parameters: 2(Integer) +2025-04-17 16:29:34.418 DEBUG 14952 --- [http-nio-9092-exec-1] c.m.m.L.selectList : <== Total: 2 +2025-04-17 16:29:45.017 DEBUG 14952 --- [http-nio-9092-exec-3] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM learning_resources +2025-04-17 16:29:45.019 DEBUG 14952 --- [http-nio-9092-exec-3] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 16:29:45.052 DEBUG 14952 --- [http-nio-9092-exec-3] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 16:29:45.052 DEBUG 14952 --- [http-nio-9092-exec-3] c.m.m.L.selectList : ==> Preparing: SELECT resource_id,title,type,url,duration,description FROM learning_resources LIMIT ? +2025-04-17 16:29:45.053 DEBUG 14952 --- [http-nio-9092-exec-3] c.m.m.L.selectList : ==> Parameters: 2(Integer) +2025-04-17 16:29:45.092 DEBUG 14952 --- [http-nio-9092-exec-3] c.m.m.L.selectList : <== Total: 2 +2025-04-17 16:29:45.673 DEBUG 14952 --- [http-nio-9092-exec-4] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM legalAidResources +2025-04-17 16:29:45.673 DEBUG 14952 --- [http-nio-9092-exec-4] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 16:29:45.713 DEBUG 14952 --- [http-nio-9092-exec-4] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 16:29:45.713 DEBUG 14952 --- [http-nio-9092-exec-4] c.m.m.L.selectList : ==> Preparing: SELECT aid_id,name,type,phone_number,email,avatar,address,website_url,is_emergency,description FROM legalAidResources LIMIT ? +2025-04-17 16:29:45.713 DEBUG 14952 --- [http-nio-9092-exec-4] c.m.m.L.selectList : ==> Parameters: 6(Integer) +2025-04-17 16:29:45.754 DEBUG 14952 --- [http-nio-9092-exec-4] c.m.m.L.selectList : <== Total: 6 +2025-04-17 16:29:46.121 DEBUG 14952 --- [http-nio-9092-exec-5] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM learning_resources +2025-04-17 16:29:46.121 DEBUG 14952 --- [http-nio-9092-exec-5] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 16:29:46.153 DEBUG 14952 --- [http-nio-9092-exec-5] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 16:29:46.153 DEBUG 14952 --- [http-nio-9092-exec-5] c.m.m.L.selectList : ==> Preparing: SELECT resource_id,title,type,url,duration,description FROM learning_resources LIMIT ? +2025-04-17 16:29:46.153 DEBUG 14952 --- [http-nio-9092-exec-5] c.m.m.L.selectList : ==> Parameters: 2(Integer) +2025-04-17 16:29:46.198 DEBUG 14952 --- [http-nio-9092-exec-5] c.m.m.L.selectList : <== Total: 2 +2025-04-17 16:29:55.345 DEBUG 14952 --- [http-nio-9092-exec-6] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM learning_resources +2025-04-17 16:29:55.345 DEBUG 14952 --- [http-nio-9092-exec-6] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 16:29:55.397 DEBUG 14952 --- [http-nio-9092-exec-6] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 16:29:55.397 DEBUG 14952 --- [http-nio-9092-exec-6] c.m.m.L.selectList : ==> Preparing: SELECT resource_id,title,type,url,duration,description FROM learning_resources LIMIT ? +2025-04-17 16:29:55.397 DEBUG 14952 --- [http-nio-9092-exec-6] c.m.m.L.selectList : ==> Parameters: 2(Integer) +2025-04-17 16:29:55.438 DEBUG 14952 --- [http-nio-9092-exec-6] c.m.m.L.selectList : <== Total: 2 +2025-04-17 16:29:55.766 DEBUG 14952 --- [http-nio-9092-exec-7] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM legalAidResources +2025-04-17 16:29:55.766 DEBUG 14952 --- [http-nio-9092-exec-7] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 16:29:55.822 DEBUG 14952 --- [http-nio-9092-exec-7] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 16:29:55.823 DEBUG 14952 --- [http-nio-9092-exec-7] c.m.m.L.selectList : ==> Preparing: SELECT aid_id,name,type,phone_number,email,avatar,address,website_url,is_emergency,description FROM legalAidResources LIMIT ? +2025-04-17 16:29:55.823 DEBUG 14952 --- [http-nio-9092-exec-7] c.m.m.L.selectList : ==> Parameters: 6(Integer) +2025-04-17 16:29:55.869 DEBUG 14952 --- [http-nio-9092-exec-7] c.m.m.L.selectList : <== Total: 6 +2025-04-17 16:29:57.228 DEBUG 14952 --- [http-nio-9092-exec-8] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM learning_resources +2025-04-17 16:29:57.228 DEBUG 14952 --- [http-nio-9092-exec-8] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 16:29:57.258 DEBUG 14952 --- [http-nio-9092-exec-8] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 16:29:57.258 DEBUG 14952 --- [http-nio-9092-exec-8] c.m.m.L.selectList : ==> Preparing: SELECT resource_id,title,type,url,duration,description FROM learning_resources LIMIT ? +2025-04-17 16:29:57.258 DEBUG 14952 --- [http-nio-9092-exec-8] c.m.m.L.selectList : ==> Parameters: 2(Integer) +2025-04-17 16:29:57.292 DEBUG 14952 --- [http-nio-9092-exec-8] c.m.m.L.selectList : <== Total: 2 +2025-04-17 16:30:03.147 DEBUG 14952 --- [http-nio-9092-exec-9] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM learning_resources +2025-04-17 16:30:03.147 DEBUG 14952 --- [http-nio-9092-exec-9] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 16:30:03.201 DEBUG 14952 --- [http-nio-9092-exec-9] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 16:30:03.201 DEBUG 14952 --- [http-nio-9092-exec-9] c.m.m.L.selectList : ==> Preparing: SELECT resource_id,title,type,url,duration,description FROM learning_resources LIMIT ? +2025-04-17 16:30:03.201 DEBUG 14952 --- [http-nio-9092-exec-9] c.m.m.L.selectList : ==> Parameters: 2(Integer) +2025-04-17 16:30:03.236 DEBUG 14952 --- [http-nio-9092-exec-9] c.m.m.L.selectList : <== Total: 2 +2025-04-17 16:30:03.819 DEBUG 14952 --- [http-nio-9092-exec-10] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM legalAidResources +2025-04-17 16:30:03.819 DEBUG 14952 --- [http-nio-9092-exec-10] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 16:30:03.862 DEBUG 14952 --- [http-nio-9092-exec-10] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 16:30:03.863 DEBUG 14952 --- [http-nio-9092-exec-10] c.m.m.L.selectList : ==> Preparing: SELECT aid_id,name,type,phone_number,email,avatar,address,website_url,is_emergency,description FROM legalAidResources LIMIT ? +2025-04-17 16:30:03.863 DEBUG 14952 --- [http-nio-9092-exec-10] c.m.m.L.selectList : ==> Parameters: 6(Integer) +2025-04-17 16:30:03.899 DEBUG 14952 --- [http-nio-9092-exec-10] c.m.m.L.selectList : <== Total: 6 +2025-04-17 16:33:12.914 DEBUG 14952 --- [http-nio-9092-exec-1] c.m.m.C.getAllCategoriesWithLaws : ==> Preparing: SELECT c.category_id, c.name, c.description, l.law_id, l.category_id AS law_category_id, l.title, l.summary, l.content, l.effective_date, l.reference_url FROM categories c LEFT JOIN laws l ON c.category_id = l.category_id ORDER BY c.category_id, l.law_id +2025-04-17 16:33:12.914 DEBUG 14952 --- [http-nio-9092-exec-1] c.m.m.C.getAllCategoriesWithLaws : ==> Parameters: +2025-04-17 16:33:12.964 DEBUG 14952 --- [http-nio-9092-exec-1] c.m.m.C.getAllCategoriesWithLaws : <== Total: 6 +2025-04-17 16:33:15.527 DEBUG 14952 --- [http-nio-9092-exec-4] c.mingchen.common.config.JwtLoginFilter : Request is to process authentication +2025-04-17 16:33:15.639 DEBUG 14952 --- [http-nio-9092-exec-4] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-17 16:33:15.639 DEBUG 14952 --- [http-nio-9092-exec-4] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-17 16:33:15.672 DEBUG 14952 --- [http-nio-9092-exec-4] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-17 16:33:15.794 DEBUG 14952 --- [http-nio-9092-exec-5] c.m.m.C.getAllCategoriesWithLaws : ==> Preparing: SELECT c.category_id, c.name, c.description, l.law_id, l.category_id AS law_category_id, l.title, l.summary, l.content, l.effective_date, l.reference_url FROM categories c LEFT JOIN laws l ON c.category_id = l.category_id ORDER BY c.category_id, l.law_id +2025-04-17 16:33:15.794 DEBUG 14952 --- [http-nio-9092-exec-5] c.m.m.C.getAllCategoriesWithLaws : ==> Parameters: +2025-04-17 16:33:15.857 DEBUG 14952 --- [http-nio-9092-exec-5] c.m.m.C.getAllCategoriesWithLaws : <== Total: 6 +2025-04-17 16:33:18.353 DEBUG 14952 --- [http-nio-9092-exec-6] c.mingchen.common.config.JwtLoginFilter : Request is to process authentication +2025-04-17 16:33:18.414 DEBUG 14952 --- [http-nio-9092-exec-6] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-17 16:33:18.415 DEBUG 14952 --- [http-nio-9092-exec-6] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-17 16:33:18.449 DEBUG 14952 --- [http-nio-9092-exec-6] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-17 16:33:18.564 DEBUG 14952 --- [http-nio-9092-exec-7] c.m.m.C.getAllCategoriesWithLaws : ==> Preparing: SELECT c.category_id, c.name, c.description, l.law_id, l.category_id AS law_category_id, l.title, l.summary, l.content, l.effective_date, l.reference_url FROM categories c LEFT JOIN laws l ON c.category_id = l.category_id ORDER BY c.category_id, l.law_id +2025-04-17 16:33:18.564 DEBUG 14952 --- [http-nio-9092-exec-7] c.m.m.C.getAllCategoriesWithLaws : ==> Parameters: +2025-04-17 16:33:18.610 DEBUG 14952 --- [http-nio-9092-exec-7] c.m.m.C.getAllCategoriesWithLaws : <== Total: 6 +2025-04-17 16:33:20.916 DEBUG 14952 --- [http-nio-9092-exec-8] c.mingchen.common.config.JwtLoginFilter : Request is to process authentication +2025-04-17 16:33:20.973 DEBUG 14952 --- [http-nio-9092-exec-8] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-17 16:33:20.974 DEBUG 14952 --- [http-nio-9092-exec-8] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-17 16:33:21.016 DEBUG 14952 --- [http-nio-9092-exec-8] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-17 16:33:21.141 DEBUG 14952 --- [http-nio-9092-exec-9] c.m.m.C.getAllCategoriesWithLaws : ==> Preparing: SELECT c.category_id, c.name, c.description, l.law_id, l.category_id AS law_category_id, l.title, l.summary, l.content, l.effective_date, l.reference_url FROM categories c LEFT JOIN laws l ON c.category_id = l.category_id ORDER BY c.category_id, l.law_id +2025-04-17 16:33:21.141 DEBUG 14952 --- [http-nio-9092-exec-9] c.m.m.C.getAllCategoriesWithLaws : ==> Parameters: +2025-04-17 16:33:21.185 DEBUG 14952 --- [http-nio-9092-exec-9] c.m.m.C.getAllCategoriesWithLaws : <== Total: 6 +2025-04-17 16:33:23.271 DEBUG 14952 --- [http-nio-9092-exec-10] c.mingchen.common.config.JwtLoginFilter : Request is to process authentication +2025-04-17 16:33:23.328 DEBUG 14952 --- [http-nio-9092-exec-10] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-17 16:33:23.329 DEBUG 14952 --- [http-nio-9092-exec-10] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-17 16:33:23.359 DEBUG 14952 --- [http-nio-9092-exec-10] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-17 16:33:23.481 DEBUG 14952 --- [http-nio-9092-exec-2] c.m.m.C.getAllCategoriesWithLaws : ==> Preparing: SELECT c.category_id, c.name, c.description, l.law_id, l.category_id AS law_category_id, l.title, l.summary, l.content, l.effective_date, l.reference_url FROM categories c LEFT JOIN laws l ON c.category_id = l.category_id ORDER BY c.category_id, l.law_id +2025-04-17 16:33:23.481 DEBUG 14952 --- [http-nio-9092-exec-2] c.m.m.C.getAllCategoriesWithLaws : ==> Parameters: +2025-04-17 16:33:23.538 DEBUG 14952 --- [http-nio-9092-exec-2] c.m.m.C.getAllCategoriesWithLaws : <== Total: 6 +2025-04-17 16:33:25.954 DEBUG 14952 --- [http-nio-9092-exec-1] c.mingchen.common.config.JwtLoginFilter : Request is to process authentication +2025-04-17 16:33:26.009 DEBUG 14952 --- [http-nio-9092-exec-1] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-17 16:33:26.010 DEBUG 14952 --- [http-nio-9092-exec-1] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-17 16:33:26.044 DEBUG 14952 --- [http-nio-9092-exec-1] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-17 16:33:26.169 DEBUG 14952 --- [http-nio-9092-exec-3] c.m.m.C.getAllCategoriesWithLaws : ==> Preparing: SELECT c.category_id, c.name, c.description, l.law_id, l.category_id AS law_category_id, l.title, l.summary, l.content, l.effective_date, l.reference_url FROM categories c LEFT JOIN laws l ON c.category_id = l.category_id ORDER BY c.category_id, l.law_id +2025-04-17 16:33:26.169 DEBUG 14952 --- [http-nio-9092-exec-3] c.m.m.C.getAllCategoriesWithLaws : ==> Parameters: +2025-04-17 16:33:26.224 DEBUG 14952 --- [http-nio-9092-exec-3] c.m.m.C.getAllCategoriesWithLaws : <== Total: 6 +2025-04-17 16:33:28.505 DEBUG 14952 --- [http-nio-9092-exec-4] c.mingchen.common.config.JwtLoginFilter : Request is to process authentication +2025-04-17 16:33:28.558 DEBUG 14952 --- [http-nio-9092-exec-4] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-17 16:33:28.558 DEBUG 14952 --- [http-nio-9092-exec-4] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-17 16:33:28.589 DEBUG 14952 --- [http-nio-9092-exec-4] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-17 16:33:28.711 DEBUG 14952 --- [http-nio-9092-exec-5] c.m.m.C.getAllCategoriesWithLaws : ==> Preparing: SELECT c.category_id, c.name, c.description, l.law_id, l.category_id AS law_category_id, l.title, l.summary, l.content, l.effective_date, l.reference_url FROM categories c LEFT JOIN laws l ON c.category_id = l.category_id ORDER BY c.category_id, l.law_id +2025-04-17 16:33:28.711 DEBUG 14952 --- [http-nio-9092-exec-5] c.m.m.C.getAllCategoriesWithLaws : ==> Parameters: +2025-04-17 16:33:28.762 DEBUG 14952 --- [http-nio-9092-exec-5] c.m.m.C.getAllCategoriesWithLaws : <== Total: 6 +2025-04-17 16:33:31.690 DEBUG 14952 --- [http-nio-9092-exec-6] c.mingchen.common.config.JwtLoginFilter : Request is to process authentication +2025-04-17 16:33:31.748 DEBUG 14952 --- [http-nio-9092-exec-6] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-17 16:33:31.749 DEBUG 14952 --- [http-nio-9092-exec-6] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-17 16:33:31.779 DEBUG 14952 --- [http-nio-9092-exec-6] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-17 16:33:31.904 DEBUG 14952 --- [http-nio-9092-exec-7] c.m.m.C.getAllCategoriesWithLaws : ==> Preparing: SELECT c.category_id, c.name, c.description, l.law_id, l.category_id AS law_category_id, l.title, l.summary, l.content, l.effective_date, l.reference_url FROM categories c LEFT JOIN laws l ON c.category_id = l.category_id ORDER BY c.category_id, l.law_id +2025-04-17 16:33:31.904 DEBUG 14952 --- [http-nio-9092-exec-7] c.m.m.C.getAllCategoriesWithLaws : ==> Parameters: +2025-04-17 16:33:31.957 DEBUG 14952 --- [http-nio-9092-exec-7] c.m.m.C.getAllCategoriesWithLaws : <== Total: 6 +2025-04-17 16:34:01.365 DEBUG 14952 --- [http-nio-9092-exec-8] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM legalAidResources +2025-04-17 16:34:01.365 DEBUG 14952 --- [http-nio-9092-exec-8] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 16:34:01.399 DEBUG 14952 --- [http-nio-9092-exec-8] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 16:34:01.400 DEBUG 14952 --- [http-nio-9092-exec-8] c.m.m.L.selectList : ==> Preparing: SELECT aid_id,name,type,phone_number,email,avatar,address,website_url,is_emergency,description FROM legalAidResources LIMIT ? +2025-04-17 16:34:01.400 DEBUG 14952 --- [http-nio-9092-exec-8] c.m.m.L.selectList : ==> Parameters: 6(Integer) +2025-04-17 16:34:01.442 DEBUG 14952 --- [http-nio-9092-exec-8] c.m.m.L.selectList : <== Total: 6 +2025-04-17 16:34:14.410 DEBUG 14952 --- [http-nio-9092-exec-9] c.mingchen.common.config.JwtLoginFilter : Request is to process authentication +2025-04-17 16:34:14.449 DEBUG 14952 --- [http-nio-9092-exec-9] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-17 16:34:14.450 DEBUG 14952 --- [http-nio-9092-exec-9] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-17 16:34:14.490 DEBUG 14952 --- [http-nio-9092-exec-9] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-17 16:34:14.622 DEBUG 14952 --- [http-nio-9092-exec-10] c.m.m.C.getAllCategoriesWithLaws : ==> Preparing: SELECT c.category_id, c.name, c.description, l.law_id, l.category_id AS law_category_id, l.title, l.summary, l.content, l.effective_date, l.reference_url FROM categories c LEFT JOIN laws l ON c.category_id = l.category_id ORDER BY c.category_id, l.law_id +2025-04-17 16:34:14.623 DEBUG 14952 --- [http-nio-9092-exec-10] c.m.m.C.getAllCategoriesWithLaws : ==> Parameters: +2025-04-17 16:34:14.678 DEBUG 14952 --- [http-nio-9092-exec-10] c.m.m.C.getAllCategoriesWithLaws : <== Total: 6 +2025-04-17 16:34:24.869 DEBUG 14952 --- [http-nio-9092-exec-2] c.mingchen.common.config.JwtLoginFilter : Request is to process authentication +2025-04-17 16:34:24.908 DEBUG 14952 --- [http-nio-9092-exec-2] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-17 16:34:24.909 DEBUG 14952 --- [http-nio-9092-exec-2] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-17 16:34:24.950 DEBUG 14952 --- [http-nio-9092-exec-2] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-17 16:34:25.074 DEBUG 14952 --- [http-nio-9092-exec-1] c.m.m.C.getAllCategoriesWithLaws : ==> Preparing: SELECT c.category_id, c.name, c.description, l.law_id, l.category_id AS law_category_id, l.title, l.summary, l.content, l.effective_date, l.reference_url FROM categories c LEFT JOIN laws l ON c.category_id = l.category_id ORDER BY c.category_id, l.law_id +2025-04-17 16:34:25.075 DEBUG 14952 --- [http-nio-9092-exec-1] c.m.m.C.getAllCategoriesWithLaws : ==> Parameters: +2025-04-17 16:34:25.122 DEBUG 14952 --- [http-nio-9092-exec-1] c.m.m.C.getAllCategoriesWithLaws : <== Total: 6 +2025-04-17 16:34:53.352 DEBUG 14952 --- [http-nio-9092-exec-3] c.mingchen.common.config.JwtLoginFilter : Request is to process authentication +2025-04-17 16:34:53.410 DEBUG 14952 --- [http-nio-9092-exec-3] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-17 16:34:53.410 DEBUG 14952 --- [http-nio-9092-exec-3] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-17 16:34:53.449 DEBUG 14952 --- [http-nio-9092-exec-3] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-17 16:34:53.584 DEBUG 14952 --- [http-nio-9092-exec-4] c.m.m.C.getAllCategoriesWithLaws : ==> Preparing: SELECT c.category_id, c.name, c.description, l.law_id, l.category_id AS law_category_id, l.title, l.summary, l.content, l.effective_date, l.reference_url FROM categories c LEFT JOIN laws l ON c.category_id = l.category_id ORDER BY c.category_id, l.law_id +2025-04-17 16:34:53.584 DEBUG 14952 --- [http-nio-9092-exec-4] c.m.m.C.getAllCategoriesWithLaws : ==> Parameters: +2025-04-17 16:34:53.612 DEBUG 14952 --- [http-nio-9092-exec-4] c.m.m.C.getAllCategoriesWithLaws : <== Total: 6 +2025-04-17 16:36:04.219 DEBUG 14952 --- [http-nio-9092-exec-6] c.m.m.C.getAllCategoriesWithLaws : ==> Preparing: SELECT c.category_id, c.name, c.description, l.law_id, l.category_id AS law_category_id, l.title, l.summary, l.content, l.effective_date, l.reference_url FROM categories c LEFT JOIN laws l ON c.category_id = l.category_id ORDER BY c.category_id, l.law_id +2025-04-17 16:36:04.219 DEBUG 14952 --- [http-nio-9092-exec-6] c.m.m.C.getAllCategoriesWithLaws : ==> Parameters: +2025-04-17 16:36:04.257 DEBUG 14952 --- [http-nio-9092-exec-6] c.m.m.C.getAllCategoriesWithLaws : <== Total: 6 +2025-04-17 16:36:04.551 DEBUG 14952 --- [http-nio-9092-exec-7] c.m.m.C.getAllCategoriesWithLaws : ==> Preparing: SELECT c.category_id, c.name, c.description, l.law_id, l.category_id AS law_category_id, l.title, l.summary, l.content, l.effective_date, l.reference_url FROM categories c LEFT JOIN laws l ON c.category_id = l.category_id ORDER BY c.category_id, l.law_id +2025-04-17 16:36:04.551 DEBUG 14952 --- [http-nio-9092-exec-7] c.m.m.C.getAllCategoriesWithLaws : ==> Parameters: +2025-04-17 16:36:04.604 DEBUG 14952 --- [http-nio-9092-exec-7] c.m.m.C.getAllCategoriesWithLaws : <== Total: 6 +2025-04-17 16:36:05.999 DEBUG 14952 --- [http-nio-9092-exec-8] c.m.m.C.getAllCategoriesWithLaws : ==> Preparing: SELECT c.category_id, c.name, c.description, l.law_id, l.category_id AS law_category_id, l.title, l.summary, l.content, l.effective_date, l.reference_url FROM categories c LEFT JOIN laws l ON c.category_id = l.category_id ORDER BY c.category_id, l.law_id +2025-04-17 16:36:05.999 DEBUG 14952 --- [http-nio-9092-exec-8] c.m.m.C.getAllCategoriesWithLaws : ==> Parameters: +2025-04-17 16:36:06.054 DEBUG 14952 --- [http-nio-9092-exec-8] c.m.m.C.getAllCategoriesWithLaws : <== Total: 6 +2025-04-17 16:36:06.820 DEBUG 14952 --- [http-nio-9092-exec-9] c.m.m.C.getAllCategoriesWithLaws : ==> Preparing: SELECT c.category_id, c.name, c.description, l.law_id, l.category_id AS law_category_id, l.title, l.summary, l.content, l.effective_date, l.reference_url FROM categories c LEFT JOIN laws l ON c.category_id = l.category_id ORDER BY c.category_id, l.law_id +2025-04-17 16:36:06.820 DEBUG 14952 --- [http-nio-9092-exec-9] c.m.m.C.getAllCategoriesWithLaws : ==> Parameters: +2025-04-17 16:36:06.857 DEBUG 14952 --- [http-nio-9092-exec-9] c.m.m.C.getAllCategoriesWithLaws : <== Total: 6 +2025-04-17 16:37:37.862 DEBUG 14952 --- [http-nio-9092-exec-2] c.m.m.C.getAllCategoriesWithLaws : ==> Preparing: SELECT c.category_id, c.name, c.description, l.law_id, l.category_id AS law_category_id, l.title, l.summary, l.content, l.effective_date, l.reference_url FROM categories c LEFT JOIN laws l ON c.category_id = l.category_id ORDER BY c.category_id, l.law_id +2025-04-17 16:37:37.863 DEBUG 14952 --- [http-nio-9092-exec-2] c.m.m.C.getAllCategoriesWithLaws : ==> Parameters: +2025-04-17 16:37:37.918 DEBUG 14952 --- [http-nio-9092-exec-2] c.m.m.C.getAllCategoriesWithLaws : <== Total: 6 +2025-04-17 16:38:56.493 DEBUG 14952 --- [http-nio-9092-exec-4] c.mingchen.common.config.JwtLoginFilter : Request is to process authentication +2025-04-17 16:38:56.535 DEBUG 14952 --- [http-nio-9092-exec-4] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-17 16:38:56.535 DEBUG 14952 --- [http-nio-9092-exec-4] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-17 16:38:56.570 DEBUG 14952 --- [http-nio-9092-exec-4] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-17 16:38:56.698 DEBUG 14952 --- [http-nio-9092-exec-5] c.m.m.C.getAllCategoriesWithLaws : ==> Preparing: SELECT c.category_id, c.name, c.description, l.law_id, l.category_id AS law_category_id, l.title, l.summary, l.content, l.effective_date, l.reference_url FROM categories c LEFT JOIN laws l ON c.category_id = l.category_id ORDER BY c.category_id, l.law_id +2025-04-17 16:38:56.698 DEBUG 14952 --- [http-nio-9092-exec-5] c.m.m.C.getAllCategoriesWithLaws : ==> Parameters: +2025-04-17 16:38:56.754 DEBUG 14952 --- [http-nio-9092-exec-5] c.m.m.C.getAllCategoriesWithLaws : <== Total: 6 +2025-04-17 16:38:59.134 DEBUG 14952 --- [http-nio-9092-exec-6] c.mingchen.common.config.JwtLoginFilter : Request is to process authentication +2025-04-17 16:38:59.189 DEBUG 14952 --- [http-nio-9092-exec-6] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-17 16:38:59.190 DEBUG 14952 --- [http-nio-9092-exec-6] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-17 16:38:59.230 DEBUG 14952 --- [http-nio-9092-exec-6] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-17 16:38:59.346 DEBUG 14952 --- [http-nio-9092-exec-7] c.m.m.C.getAllCategoriesWithLaws : ==> Preparing: SELECT c.category_id, c.name, c.description, l.law_id, l.category_id AS law_category_id, l.title, l.summary, l.content, l.effective_date, l.reference_url FROM categories c LEFT JOIN laws l ON c.category_id = l.category_id ORDER BY c.category_id, l.law_id +2025-04-17 16:38:59.346 DEBUG 14952 --- [http-nio-9092-exec-7] c.m.m.C.getAllCategoriesWithLaws : ==> Parameters: +2025-04-17 16:38:59.387 DEBUG 14952 --- [http-nio-9092-exec-7] c.m.m.C.getAllCategoriesWithLaws : <== Total: 6 +2025-04-17 16:39:02.136 DEBUG 14952 --- [http-nio-9092-exec-8] c.mingchen.common.config.JwtLoginFilter : Request is to process authentication +2025-04-17 16:39:02.175 DEBUG 14952 --- [http-nio-9092-exec-8] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-17 16:39:02.175 DEBUG 14952 --- [http-nio-9092-exec-8] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-17 16:39:02.215 DEBUG 14952 --- [http-nio-9092-exec-8] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-17 16:39:02.339 DEBUG 14952 --- [http-nio-9092-exec-9] c.m.m.C.getAllCategoriesWithLaws : ==> Preparing: SELECT c.category_id, c.name, c.description, l.law_id, l.category_id AS law_category_id, l.title, l.summary, l.content, l.effective_date, l.reference_url FROM categories c LEFT JOIN laws l ON c.category_id = l.category_id ORDER BY c.category_id, l.law_id +2025-04-17 16:39:02.339 DEBUG 14952 --- [http-nio-9092-exec-9] c.m.m.C.getAllCategoriesWithLaws : ==> Parameters: +2025-04-17 16:39:02.377 DEBUG 14952 --- [http-nio-9092-exec-9] c.m.m.C.getAllCategoriesWithLaws : <== Total: 6 +2025-04-17 16:39:04.712 DEBUG 14952 --- [http-nio-9092-exec-10] c.mingchen.common.config.JwtLoginFilter : Request is to process authentication +2025-04-17 16:39:04.757 DEBUG 14952 --- [http-nio-9092-exec-10] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-17 16:39:04.758 DEBUG 14952 --- [http-nio-9092-exec-10] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-17 16:39:04.789 DEBUG 14952 --- [http-nio-9092-exec-10] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-17 16:39:04.914 DEBUG 14952 --- [http-nio-9092-exec-2] c.m.m.C.getAllCategoriesWithLaws : ==> Preparing: SELECT c.category_id, c.name, c.description, l.law_id, l.category_id AS law_category_id, l.title, l.summary, l.content, l.effective_date, l.reference_url FROM categories c LEFT JOIN laws l ON c.category_id = l.category_id ORDER BY c.category_id, l.law_id +2025-04-17 16:39:04.914 DEBUG 14952 --- [http-nio-9092-exec-2] c.m.m.C.getAllCategoriesWithLaws : ==> Parameters: +2025-04-17 16:39:04.957 DEBUG 14952 --- [http-nio-9092-exec-2] c.m.m.C.getAllCategoriesWithLaws : <== Total: 6 +2025-04-17 16:39:06.765 DEBUG 14952 --- [http-nio-9092-exec-1] c.mingchen.common.config.JwtLoginFilter : Request is to process authentication +2025-04-17 16:39:06.809 DEBUG 14952 --- [http-nio-9092-exec-1] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-17 16:39:06.810 DEBUG 14952 --- [http-nio-9092-exec-1] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-17 16:39:06.850 DEBUG 14952 --- [http-nio-9092-exec-1] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-17 16:39:06.966 DEBUG 14952 --- [http-nio-9092-exec-3] c.m.m.C.getAllCategoriesWithLaws : ==> Preparing: SELECT c.category_id, c.name, c.description, l.law_id, l.category_id AS law_category_id, l.title, l.summary, l.content, l.effective_date, l.reference_url FROM categories c LEFT JOIN laws l ON c.category_id = l.category_id ORDER BY c.category_id, l.law_id +2025-04-17 16:39:06.966 DEBUG 14952 --- [http-nio-9092-exec-3] c.m.m.C.getAllCategoriesWithLaws : ==> Parameters: +2025-04-17 16:39:07.009 DEBUG 14952 --- [http-nio-9092-exec-3] c.m.m.C.getAllCategoriesWithLaws : <== Total: 6 +2025-04-17 16:39:08.660 DEBUG 14952 --- [http-nio-9092-exec-4] c.mingchen.common.config.JwtLoginFilter : Request is to process authentication +2025-04-17 16:39:08.705 DEBUG 14952 --- [http-nio-9092-exec-4] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-17 16:39:08.706 DEBUG 14952 --- [http-nio-9092-exec-4] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-17 16:39:08.736 DEBUG 14952 --- [http-nio-9092-exec-4] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-17 16:39:08.856 DEBUG 14952 --- [http-nio-9092-exec-5] c.m.m.C.getAllCategoriesWithLaws : ==> Preparing: SELECT c.category_id, c.name, c.description, l.law_id, l.category_id AS law_category_id, l.title, l.summary, l.content, l.effective_date, l.reference_url FROM categories c LEFT JOIN laws l ON c.category_id = l.category_id ORDER BY c.category_id, l.law_id +2025-04-17 16:39:08.856 DEBUG 14952 --- [http-nio-9092-exec-5] c.m.m.C.getAllCategoriesWithLaws : ==> Parameters: +2025-04-17 16:39:08.900 DEBUG 14952 --- [http-nio-9092-exec-5] c.m.m.C.getAllCategoriesWithLaws : <== Total: 6 +2025-04-17 16:39:10.792 DEBUG 14952 --- [http-nio-9092-exec-6] c.mingchen.common.config.JwtLoginFilter : Request is to process authentication +2025-04-17 16:39:10.828 DEBUG 14952 --- [http-nio-9092-exec-6] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-17 16:39:10.829 DEBUG 14952 --- [http-nio-9092-exec-6] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-17 16:39:10.861 DEBUG 14952 --- [http-nio-9092-exec-6] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-17 16:39:10.982 DEBUG 14952 --- [http-nio-9092-exec-7] c.m.m.C.getAllCategoriesWithLaws : ==> Preparing: SELECT c.category_id, c.name, c.description, l.law_id, l.category_id AS law_category_id, l.title, l.summary, l.content, l.effective_date, l.reference_url FROM categories c LEFT JOIN laws l ON c.category_id = l.category_id ORDER BY c.category_id, l.law_id +2025-04-17 16:39:10.982 DEBUG 14952 --- [http-nio-9092-exec-7] c.m.m.C.getAllCategoriesWithLaws : ==> Parameters: +2025-04-17 16:39:11.029 DEBUG 14952 --- [http-nio-9092-exec-7] c.m.m.C.getAllCategoriesWithLaws : <== Total: 6 +2025-04-17 16:39:14.107 DEBUG 14952 --- [http-nio-9092-exec-8] c.mingchen.common.config.JwtLoginFilter : Request is to process authentication +2025-04-17 16:39:14.155 DEBUG 14952 --- [http-nio-9092-exec-8] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-17 16:39:14.156 DEBUG 14952 --- [http-nio-9092-exec-8] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-17 16:39:14.195 DEBUG 14952 --- [http-nio-9092-exec-8] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-17 16:39:14.312 DEBUG 14952 --- [http-nio-9092-exec-9] c.m.m.C.getAllCategoriesWithLaws : ==> Preparing: SELECT c.category_id, c.name, c.description, l.law_id, l.category_id AS law_category_id, l.title, l.summary, l.content, l.effective_date, l.reference_url FROM categories c LEFT JOIN laws l ON c.category_id = l.category_id ORDER BY c.category_id, l.law_id +2025-04-17 16:39:14.312 DEBUG 14952 --- [http-nio-9092-exec-9] c.m.m.C.getAllCategoriesWithLaws : ==> Parameters: +2025-04-17 16:39:14.354 DEBUG 14952 --- [http-nio-9092-exec-9] c.m.m.C.getAllCategoriesWithLaws : <== Total: 6 +2025-04-17 16:41:05.434 DEBUG 14952 --- [http-nio-9092-exec-2] c.m.m.C.getAllCategoriesWithLaws : ==> Preparing: SELECT c.category_id, c.name, c.description, l.law_id, l.category_id AS law_category_id, l.title, l.summary, l.content, l.effective_date, l.reference_url FROM categories c LEFT JOIN laws l ON c.category_id = l.category_id ORDER BY c.category_id, l.law_id +2025-04-17 16:41:05.434 DEBUG 14952 --- [http-nio-9092-exec-2] c.m.m.C.getAllCategoriesWithLaws : ==> Parameters: +2025-04-17 16:41:05.474 DEBUG 14952 --- [http-nio-9092-exec-2] c.m.m.C.getAllCategoriesWithLaws : <== Total: 6 +2025-04-17 16:45:43.900 INFO 14952 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED paused. +2025-04-17 16:45:43.901 INFO 14952 --- [SpringContextShutdownHook] o.s.s.quartz.SchedulerFactoryBean : Shutting down Quartz Scheduler +2025-04-17 16:45:43.901 INFO 14952 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED shutting down. +2025-04-17 16:45:43.901 INFO 14952 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED paused. +2025-04-17 16:45:43.901 INFO 14952 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED shutdown complete. +2025-04-17 16:45:43.902 INFO 14952 --- [SpringContextShutdownHook] o.s.s.concurrent.ThreadPoolTaskExecutor : Shutting down ExecutorService 'applicationTaskExecutor' +2025-04-17 16:45:43.909 INFO 14952 --- [SpringContextShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown initiated... +2025-04-17 16:45:43.910 INFO 14952 --- [SpringContextShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown completed. +2025-04-17 16:45:46.703 INFO 24548 --- [restartedMain] com.mingchen.BlogApiApplication : Starting BlogApiApplication on mingchendeMac-mini.local with PID 24548 (/Users/mingchen/code/java/other/legalAid/api/target/classes started by mingchen in /Users/mingchen/code/java/other/legalAid) +2025-04-17 16:45:46.704 DEBUG 24548 --- [restartedMain] com.mingchen.BlogApiApplication : Running with Spring Boot v2.2.7.RELEASE, Spring v5.2.6.RELEASE +2025-04-17 16:45:46.705 INFO 24548 --- [restartedMain] com.mingchen.BlogApiApplication : The following profiles are active: dev +2025-04-17 16:45:46.724 INFO 24548 --- [restartedMain] o.s.b.devtools.restart.ChangeableUrls : The Class-Path manifest attribute in /usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/jaxb-runtime-2.3.1.jar referenced one or more files that do not exist: file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/jaxb-api-2.3.1.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/txw2-2.3.1.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/istack-commons-runtime-3.0.7.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/stax-ex-1.8.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/FastInfoset-1.2.15.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/javax.activation-api-1.2.0.jar +2025-04-17 16:45:46.725 INFO 24548 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : Devtools property defaults active! Set 'spring.devtools.add-properties' to 'false' to disable +2025-04-17 16:45:46.725 INFO 24548 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : For additional web related logging consider setting the 'logging.level.web' property to 'DEBUG' +2025-04-17 16:45:46.937 INFO 24548 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Multiple Spring Data modules found, entering strict repository configuration mode! +2025-04-17 16:45:46.938 INFO 24548 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data Redis repositories in DEFAULT mode. +2025-04-17 16:45:46.951 INFO 24548 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 8ms. Found 0 Redis repository interfaces. +2025-04-17 16:45:47.198 INFO 24548 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 9092 (http) +2025-04-17 16:45:47.201 INFO 24548 --- [restartedMain] o.apache.catalina.core.StandardService : Starting service [Tomcat] +2025-04-17 16:45:47.202 INFO 24548 --- [restartedMain] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.34] +2025-04-17 16:45:47.225 INFO 24548 --- [restartedMain] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext +2025-04-17 16:45:47.225 INFO 24548 --- [restartedMain] o.s.web.context.ContextLoader : Root WebApplicationContext: initialization completed in 500 ms +2025-04-17 16:45:47.733 INFO 24548 --- [restartedMain] n.b.p.u.AbstractUserAgentAnalyzerDirect : - Loaded 90 files in 211 msec using expression: classpath*:UserAgents/**/*.yaml +2025-04-17 16:45:47.733 INFO 24548 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : +2025-04-17 16:45:47.733 INFO 24548 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : /-----------------------------------------------------------\ +2025-04-17 16:45:47.733 INFO 24548 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : | Yauaa 5.20 (v5.20 @ 2020-11-22T15:39:16Z) | +2025-04-17 16:45:47.733 INFO 24548 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : +-----------------------------------------------------------+ +2025-04-17 16:45:47.733 INFO 24548 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : | For more information: https://yauaa.basjes.nl | +2025-04-17 16:45:47.733 INFO 24548 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : | Copyright (C) 2013-2020 Niels Basjes - License Apache 2.0 | +2025-04-17 16:45:47.733 INFO 24548 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : \-----------------------------------------------------------/ +2025-04-17 16:45:47.733 INFO 24548 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : +2025-04-17 16:45:47.738 INFO 24548 --- [restartedMain] n.b.p.u.AbstractUserAgentAnalyzerDirect : Building all needed matchers for the requested 11 fields. +2025-04-17 16:45:47.793 INFO 24548 --- [restartedMain] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor' +2025-04-17 16:45:47.869 INFO 24548 --- [restartedMain] org.quartz.impl.StdSchedulerFactory : Using default implementation for ThreadExecutor +2025-04-17 16:45:47.873 INFO 24548 --- [restartedMain] org.quartz.core.SchedulerSignalerImpl : Initialized Scheduler Signaller of type: class org.quartz.core.SchedulerSignalerImpl +2025-04-17 16:45:47.873 INFO 24548 --- [restartedMain] org.quartz.core.QuartzScheduler : Quartz Scheduler v.2.3.2 created. +2025-04-17 16:45:47.873 INFO 24548 --- [restartedMain] org.quartz.simpl.RAMJobStore : RAMJobStore initialized. +2025-04-17 16:45:47.873 INFO 24548 --- [restartedMain] org.quartz.core.QuartzScheduler : Scheduler meta-data: Quartz Scheduler (v2.3.2) 'quartzScheduler' with instanceId 'NON_CLUSTERED' + Scheduler class: 'org.quartz.core.QuartzScheduler' - running locally. + NOT STARTED. + Currently in standby mode. + Number of jobs executed: 0 + Using thread pool 'org.quartz.simpl.SimpleThreadPool' - with 10 threads. + Using job-store 'org.quartz.simpl.RAMJobStore' - which does not support persistence. and is not clustered. + +2025-04-17 16:45:47.873 INFO 24548 --- [restartedMain] org.quartz.impl.StdSchedulerFactory : Quartz scheduler 'quartzScheduler' initialized from an externally provided properties instance. +2025-04-17 16:45:47.873 INFO 24548 --- [restartedMain] org.quartz.impl.StdSchedulerFactory : Quartz scheduler version: 2.3.2 +2025-04-17 16:45:47.873 INFO 24548 --- [restartedMain] org.quartz.core.QuartzScheduler : JobFactory set to: org.springframework.scheduling.quartz.SpringBeanJobFactory@35d39c05 +2025-04-17 16:45:47.904 INFO 24548 --- [restartedMain] o.s.s.web.DefaultSecurityFilterChain : Creating filter chain: any request, [org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter@24e3f1d5, org.springframework.security.web.context.SecurityContextPersistenceFilter@2bb656ee, org.springframework.security.web.header.HeaderWriterFilter@33508f94, org.springframework.web.filter.CorsFilter@ebd68cf, org.springframework.security.web.authentication.logout.LogoutFilter@3e30f798, com.mingchen.common.config.JwtLoginFilter@6b9e8b5b, com.mingchen.common.config.JwtFilter@424aa528, org.springframework.security.web.savedrequest.RequestCacheAwareFilter@69636920, org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter@3799e026, org.springframework.security.web.authentication.AnonymousAuthenticationFilter@791c89ed, org.springframework.security.web.session.SessionManagementFilter@6a716ced, org.springframework.security.web.access.ExceptionTranslationFilter@7ef49bb5, org.springframework.security.web.access.intercept.FilterSecurityInterceptor@6a65c8e3] +2025-04-17 16:45:47.915 INFO 24548 --- [restartedMain] o.s.b.d.a.OptionalLiveReloadServer : LiveReload server is running on port 35729 +2025-04-17 16:45:47.923 INFO 24548 --- [restartedMain] o.s.s.quartz.SchedulerFactoryBean : Starting Quartz Scheduler now +2025-04-17 16:45:47.923 INFO 24548 --- [restartedMain] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED started. +2025-04-17 16:45:47.932 INFO 24548 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 9092 (http) with context path '' +2025-04-17 16:45:47.934 INFO 24548 --- [restartedMain] com.mingchen.BlogApiApplication : Started BlogApiApplication in 1.392 seconds (JVM running for 1.636) +2025-04-17 16:46:23.290 INFO 24548 --- [http-nio-9092-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet' +2025-04-17 16:46:23.291 INFO 24548 --- [http-nio-9092-exec-1] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet' +2025-04-17 16:46:23.294 INFO 24548 --- [http-nio-9092-exec-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 3 ms +2025-04-17 16:46:23.343 ERROR 24548 --- [http-nio-9092-exec-1] c.mingchen.service.impl.UserServiceImpl : Cannot invoke "com.itmingchen.common.model.CurrentUserInfo.getId()" because the return value of "com.mingchen.entity.UserContext.currentUser()" is null +2025-04-17 16:46:52.668 ERROR 24548 --- [http-nio-9092-exec-3] c.mingchen.service.impl.UserServiceImpl : Cannot invoke "com.itmingchen.common.model.CurrentUserInfo.getId()" because the return value of "com.mingchen.entity.UserContext.currentUser()" is null +2025-04-17 16:46:54.563 INFO 24548 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED paused. +2025-04-17 16:46:54.565 INFO 24548 --- [SpringContextShutdownHook] o.s.s.quartz.SchedulerFactoryBean : Shutting down Quartz Scheduler +2025-04-17 16:46:54.565 INFO 24548 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED shutting down. +2025-04-17 16:46:54.565 INFO 24548 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED paused. +2025-04-17 16:46:54.565 INFO 24548 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED shutdown complete. +2025-04-17 16:46:54.565 INFO 24548 --- [SpringContextShutdownHook] o.s.s.concurrent.ThreadPoolTaskExecutor : Shutting down ExecutorService 'applicationTaskExecutor' +2025-04-17 16:46:56.250 INFO 24616 --- [restartedMain] com.mingchen.BlogApiApplication : Starting BlogApiApplication on mingchendeMac-mini.local with PID 24616 (/Users/mingchen/code/java/other/legalAid/api/target/classes started by mingchen in /Users/mingchen/code/java/other/legalAid) +2025-04-17 16:46:56.251 DEBUG 24616 --- [restartedMain] com.mingchen.BlogApiApplication : Running with Spring Boot v2.2.7.RELEASE, Spring v5.2.6.RELEASE +2025-04-17 16:46:56.251 INFO 24616 --- [restartedMain] com.mingchen.BlogApiApplication : The following profiles are active: dev +2025-04-17 16:46:56.268 INFO 24616 --- [restartedMain] o.s.b.devtools.restart.ChangeableUrls : The Class-Path manifest attribute in /usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/jaxb-runtime-2.3.1.jar referenced one or more files that do not exist: file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/jaxb-api-2.3.1.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/txw2-2.3.1.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/istack-commons-runtime-3.0.7.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/stax-ex-1.8.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/FastInfoset-1.2.15.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/javax.activation-api-1.2.0.jar +2025-04-17 16:46:56.268 INFO 24616 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : Devtools property defaults active! Set 'spring.devtools.add-properties' to 'false' to disable +2025-04-17 16:46:56.268 INFO 24616 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : For additional web related logging consider setting the 'logging.level.web' property to 'DEBUG' +2025-04-17 16:46:56.493 INFO 24616 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Multiple Spring Data modules found, entering strict repository configuration mode! +2025-04-17 16:46:56.494 INFO 24616 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data Redis repositories in DEFAULT mode. +2025-04-17 16:46:56.508 INFO 24616 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 8ms. Found 0 Redis repository interfaces. +2025-04-17 16:46:56.771 INFO 24616 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 9092 (http) +2025-04-17 16:46:56.774 INFO 24616 --- [restartedMain] o.apache.catalina.core.StandardService : Starting service [Tomcat] +2025-04-17 16:46:56.774 INFO 24616 --- [restartedMain] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.34] +2025-04-17 16:46:56.796 INFO 24616 --- [restartedMain] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext +2025-04-17 16:46:56.796 INFO 24616 --- [restartedMain] o.s.web.context.ContextLoader : Root WebApplicationContext: initialization completed in 528 ms +2025-04-17 16:46:57.311 INFO 24616 --- [restartedMain] n.b.p.u.AbstractUserAgentAnalyzerDirect : - Loaded 90 files in 212 msec using expression: classpath*:UserAgents/**/*.yaml +2025-04-17 16:46:57.311 INFO 24616 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : +2025-04-17 16:46:57.311 INFO 24616 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : /-----------------------------------------------------------\ +2025-04-17 16:46:57.311 INFO 24616 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : | Yauaa 5.20 (v5.20 @ 2020-11-22T15:39:16Z) | +2025-04-17 16:46:57.311 INFO 24616 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : +-----------------------------------------------------------+ +2025-04-17 16:46:57.311 INFO 24616 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : | For more information: https://yauaa.basjes.nl | +2025-04-17 16:46:57.311 INFO 24616 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : | Copyright (C) 2013-2020 Niels Basjes - License Apache 2.0 | +2025-04-17 16:46:57.311 INFO 24616 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : \-----------------------------------------------------------/ +2025-04-17 16:46:57.311 INFO 24616 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : +2025-04-17 16:46:57.315 INFO 24616 --- [restartedMain] n.b.p.u.AbstractUserAgentAnalyzerDirect : Building all needed matchers for the requested 11 fields. +2025-04-17 16:46:57.370 INFO 24616 --- [restartedMain] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor' +2025-04-17 16:46:57.453 INFO 24616 --- [restartedMain] org.quartz.impl.StdSchedulerFactory : Using default implementation for ThreadExecutor +2025-04-17 16:46:57.457 INFO 24616 --- [restartedMain] org.quartz.core.SchedulerSignalerImpl : Initialized Scheduler Signaller of type: class org.quartz.core.SchedulerSignalerImpl +2025-04-17 16:46:57.458 INFO 24616 --- [restartedMain] org.quartz.core.QuartzScheduler : Quartz Scheduler v.2.3.2 created. +2025-04-17 16:46:57.458 INFO 24616 --- [restartedMain] org.quartz.simpl.RAMJobStore : RAMJobStore initialized. +2025-04-17 16:46:57.458 INFO 24616 --- [restartedMain] org.quartz.core.QuartzScheduler : Scheduler meta-data: Quartz Scheduler (v2.3.2) 'quartzScheduler' with instanceId 'NON_CLUSTERED' + Scheduler class: 'org.quartz.core.QuartzScheduler' - running locally. + NOT STARTED. + Currently in standby mode. + Number of jobs executed: 0 + Using thread pool 'org.quartz.simpl.SimpleThreadPool' - with 10 threads. + Using job-store 'org.quartz.simpl.RAMJobStore' - which does not support persistence. and is not clustered. + +2025-04-17 16:46:57.458 INFO 24616 --- [restartedMain] org.quartz.impl.StdSchedulerFactory : Quartz scheduler 'quartzScheduler' initialized from an externally provided properties instance. +2025-04-17 16:46:57.458 INFO 24616 --- [restartedMain] org.quartz.impl.StdSchedulerFactory : Quartz scheduler version: 2.3.2 +2025-04-17 16:46:57.458 INFO 24616 --- [restartedMain] org.quartz.core.QuartzScheduler : JobFactory set to: org.springframework.scheduling.quartz.SpringBeanJobFactory@f724903 +2025-04-17 16:46:57.489 INFO 24616 --- [restartedMain] o.s.s.web.DefaultSecurityFilterChain : Creating filter chain: any request, [org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter@27e5af81, org.springframework.security.web.context.SecurityContextPersistenceFilter@558a13ad, org.springframework.security.web.header.HeaderWriterFilter@594a01c, org.springframework.web.filter.CorsFilter@75834809, org.springframework.security.web.authentication.logout.LogoutFilter@8fc60d1, com.mingchen.common.config.JwtLoginFilter@4c2a880a, com.mingchen.common.config.JwtFilter@4c502414, org.springframework.security.web.savedrequest.RequestCacheAwareFilter@1d73d846, org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter@5fdd72f5, org.springframework.security.web.authentication.AnonymousAuthenticationFilter@46c303b8, org.springframework.security.web.session.SessionManagementFilter@10c02175, org.springframework.security.web.access.ExceptionTranslationFilter@2cc41e17, org.springframework.security.web.access.intercept.FilterSecurityInterceptor@6cbe493] +2025-04-17 16:46:57.500 INFO 24616 --- [restartedMain] o.s.b.d.a.OptionalLiveReloadServer : LiveReload server is running on port 35729 +2025-04-17 16:46:57.510 INFO 24616 --- [restartedMain] o.s.s.quartz.SchedulerFactoryBean : Starting Quartz Scheduler now +2025-04-17 16:46:57.510 INFO 24616 --- [restartedMain] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED started. +2025-04-17 16:46:57.519 INFO 24616 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 9092 (http) with context path '' +2025-04-17 16:46:57.522 INFO 24616 --- [restartedMain] com.mingchen.BlogApiApplication : Started BlogApiApplication in 1.444 seconds (JVM running for 1.745) +2025-04-17 16:46:59.443 INFO 24616 --- [http-nio-9092-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet' +2025-04-17 16:46:59.444 INFO 24616 --- [http-nio-9092-exec-1] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet' +2025-04-17 16:46:59.446 INFO 24616 --- [http-nio-9092-exec-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 2 ms +2025-04-17 16:46:59.491 ERROR 24616 --- [http-nio-9092-exec-1] c.mingchen.service.impl.UserServiceImpl : Cannot invoke "com.itmingchen.common.model.CurrentUserInfo.getId()" because the return value of "com.mingchen.entity.UserContext.currentUser()" is null +2025-04-17 16:47:13.104 ERROR 24616 --- [http-nio-9092-exec-3] c.mingchen.service.impl.UserServiceImpl : Cannot invoke "com.itmingchen.common.model.CurrentUserInfo.getId()" because the return value of "com.mingchen.entity.UserContext.currentUser()" is null +2025-04-17 16:47:13.161 INFO 24616 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED paused. +2025-04-17 16:47:13.163 INFO 24616 --- [SpringContextShutdownHook] o.s.s.quartz.SchedulerFactoryBean : Shutting down Quartz Scheduler +2025-04-17 16:47:13.164 INFO 24616 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED shutting down. +2025-04-17 16:47:13.164 INFO 24616 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED paused. +2025-04-17 16:47:13.164 INFO 24616 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED shutdown complete. +2025-04-17 16:47:13.164 INFO 24616 --- [SpringContextShutdownHook] o.s.s.concurrent.ThreadPoolTaskExecutor : Shutting down ExecutorService 'applicationTaskExecutor' +2025-04-17 16:48:25.729 INFO 24701 --- [restartedMain] com.mingchen.BlogApiApplication : Starting BlogApiApplication on mingchendeMac-mini.local with PID 24701 (/Users/mingchen/code/java/other/legalAid/api/target/classes started by mingchen in /Users/mingchen/code/java/other/legalAid) +2025-04-17 16:48:25.731 DEBUG 24701 --- [restartedMain] com.mingchen.BlogApiApplication : Running with Spring Boot v2.2.7.RELEASE, Spring v5.2.6.RELEASE +2025-04-17 16:48:25.731 INFO 24701 --- [restartedMain] com.mingchen.BlogApiApplication : The following profiles are active: dev +2025-04-17 16:48:25.750 INFO 24701 --- [restartedMain] o.s.b.devtools.restart.ChangeableUrls : The Class-Path manifest attribute in /usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/jaxb-runtime-2.3.1.jar referenced one or more files that do not exist: file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/jaxb-api-2.3.1.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/txw2-2.3.1.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/istack-commons-runtime-3.0.7.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/stax-ex-1.8.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/FastInfoset-1.2.15.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/javax.activation-api-1.2.0.jar +2025-04-17 16:48:25.750 INFO 24701 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : Devtools property defaults active! Set 'spring.devtools.add-properties' to 'false' to disable +2025-04-17 16:48:25.750 INFO 24701 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : For additional web related logging consider setting the 'logging.level.web' property to 'DEBUG' +2025-04-17 16:48:25.970 INFO 24701 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Multiple Spring Data modules found, entering strict repository configuration mode! +2025-04-17 16:48:25.972 INFO 24701 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data Redis repositories in DEFAULT mode. +2025-04-17 16:48:25.985 INFO 24701 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 8ms. Found 0 Redis repository interfaces. +2025-04-17 16:48:26.248 INFO 24701 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 9092 (http) +2025-04-17 16:48:26.251 INFO 24701 --- [restartedMain] o.apache.catalina.core.StandardService : Starting service [Tomcat] +2025-04-17 16:48:26.252 INFO 24701 --- [restartedMain] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.34] +2025-04-17 16:48:26.277 INFO 24701 --- [restartedMain] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext +2025-04-17 16:48:26.277 INFO 24701 --- [restartedMain] o.s.web.context.ContextLoader : Root WebApplicationContext: initialization completed in 527 ms +2025-04-17 16:48:26.831 INFO 24701 --- [restartedMain] n.b.p.u.AbstractUserAgentAnalyzerDirect : - Loaded 90 files in 211 msec using expression: classpath*:UserAgents/**/*.yaml +2025-04-17 16:48:26.831 INFO 24701 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : +2025-04-17 16:48:26.831 INFO 24701 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : /-----------------------------------------------------------\ +2025-04-17 16:48:26.831 INFO 24701 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : | Yauaa 5.20 (v5.20 @ 2020-11-22T15:39:16Z) | +2025-04-17 16:48:26.831 INFO 24701 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : +-----------------------------------------------------------+ +2025-04-17 16:48:26.831 INFO 24701 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : | For more information: https://yauaa.basjes.nl | +2025-04-17 16:48:26.831 INFO 24701 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : | Copyright (C) 2013-2020 Niels Basjes - License Apache 2.0 | +2025-04-17 16:48:26.831 INFO 24701 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : \-----------------------------------------------------------/ +2025-04-17 16:48:26.831 INFO 24701 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : +2025-04-17 16:48:26.833 INFO 24701 --- [restartedMain] n.b.p.u.AbstractUserAgentAnalyzerDirect : Building all needed matchers for the requested 11 fields. +2025-04-17 16:48:26.885 INFO 24701 --- [restartedMain] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor' +2025-04-17 16:48:26.962 INFO 24701 --- [restartedMain] org.quartz.impl.StdSchedulerFactory : Using default implementation for ThreadExecutor +2025-04-17 16:48:26.966 INFO 24701 --- [restartedMain] org.quartz.core.SchedulerSignalerImpl : Initialized Scheduler Signaller of type: class org.quartz.core.SchedulerSignalerImpl +2025-04-17 16:48:26.966 INFO 24701 --- [restartedMain] org.quartz.core.QuartzScheduler : Quartz Scheduler v.2.3.2 created. +2025-04-17 16:48:26.967 INFO 24701 --- [restartedMain] org.quartz.simpl.RAMJobStore : RAMJobStore initialized. +2025-04-17 16:48:26.967 INFO 24701 --- [restartedMain] org.quartz.core.QuartzScheduler : Scheduler meta-data: Quartz Scheduler (v2.3.2) 'quartzScheduler' with instanceId 'NON_CLUSTERED' + Scheduler class: 'org.quartz.core.QuartzScheduler' - running locally. + NOT STARTED. + Currently in standby mode. + Number of jobs executed: 0 + Using thread pool 'org.quartz.simpl.SimpleThreadPool' - with 10 threads. + Using job-store 'org.quartz.simpl.RAMJobStore' - which does not support persistence. and is not clustered. + +2025-04-17 16:48:26.967 INFO 24701 --- [restartedMain] org.quartz.impl.StdSchedulerFactory : Quartz scheduler 'quartzScheduler' initialized from an externally provided properties instance. +2025-04-17 16:48:26.967 INFO 24701 --- [restartedMain] org.quartz.impl.StdSchedulerFactory : Quartz scheduler version: 2.3.2 +2025-04-17 16:48:26.967 INFO 24701 --- [restartedMain] org.quartz.core.QuartzScheduler : JobFactory set to: org.springframework.scheduling.quartz.SpringBeanJobFactory@7bab171b +2025-04-17 16:48:26.997 INFO 24701 --- [restartedMain] o.s.s.web.DefaultSecurityFilterChain : Creating filter chain: any request, [org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter@14c240b1, org.springframework.security.web.context.SecurityContextPersistenceFilter@78a320ea, org.springframework.security.web.header.HeaderWriterFilter@5f0d4e95, org.springframework.web.filter.CorsFilter@101a7bd5, org.springframework.security.web.authentication.logout.LogoutFilter@24288fe8, com.mingchen.common.config.JwtLoginFilter@5709a3fd, com.mingchen.common.config.JwtFilter@67e9512, org.springframework.security.web.savedrequest.RequestCacheAwareFilter@45405aa0, org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter@6fcf6aba, org.springframework.security.web.authentication.AnonymousAuthenticationFilter@3f8aa4, org.springframework.security.web.session.SessionManagementFilter@30090453, org.springframework.security.web.access.ExceptionTranslationFilter@120dc937, org.springframework.security.web.access.intercept.FilterSecurityInterceptor@108c01ae] +2025-04-17 16:48:27.008 INFO 24701 --- [restartedMain] o.s.b.d.a.OptionalLiveReloadServer : LiveReload server is running on port 35729 +2025-04-17 16:48:27.016 INFO 24701 --- [restartedMain] o.s.s.quartz.SchedulerFactoryBean : Starting Quartz Scheduler now +2025-04-17 16:48:27.017 INFO 24701 --- [restartedMain] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED started. +2025-04-17 16:48:27.025 INFO 24701 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 9092 (http) with context path '' +2025-04-17 16:48:27.027 INFO 24701 --- [restartedMain] com.mingchen.BlogApiApplication : Started BlogApiApplication in 1.473 seconds (JVM running for 1.713) +2025-04-17 16:48:30.278 INFO 24701 --- [http-nio-9092-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet' +2025-04-17 16:48:30.278 INFO 24701 --- [http-nio-9092-exec-1] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet' +2025-04-17 16:48:30.280 INFO 24701 --- [http-nio-9092-exec-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 2 ms +2025-04-17 16:48:32.801 INFO 24701 --- [http-nio-9092-exec-1] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting... +2025-04-17 16:48:33.275 INFO 24701 --- [http-nio-9092-exec-1] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed. +2025-04-17 16:48:33.279 DEBUG 24701 --- [http-nio-9092-exec-1] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-17 16:48:33.291 DEBUG 24701 --- [http-nio-9092-exec-1] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-17 16:48:33.343 DEBUG 24701 --- [http-nio-9092-exec-1] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-17 16:48:34.880 DEBUG 24701 --- [http-nio-9092-exec-1] c.mingchen.mapper.UserMapper.selectById : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE user_id=? +2025-04-17 16:48:34.881 DEBUG 24701 --- [http-nio-9092-exec-1] c.mingchen.mapper.UserMapper.selectById : ==> Parameters: 1(Long) +2025-04-17 16:48:34.913 DEBUG 24701 --- [http-nio-9092-exec-1] c.mingchen.mapper.UserMapper.selectById : <== Total: 1 +2025-04-17 16:48:40.093 DEBUG 24701 --- [http-nio-9092-exec-3] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-17 16:48:40.093 DEBUG 24701 --- [http-nio-9092-exec-3] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-17 16:48:40.136 DEBUG 24701 --- [http-nio-9092-exec-3] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-17 16:48:40.137 DEBUG 24701 --- [http-nio-9092-exec-3] c.mingchen.mapper.UserMapper.selectById : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE user_id=? +2025-04-17 16:48:40.138 DEBUG 24701 --- [http-nio-9092-exec-3] c.mingchen.mapper.UserMapper.selectById : ==> Parameters: 1(Long) +2025-04-17 16:48:40.175 DEBUG 24701 --- [http-nio-9092-exec-3] c.mingchen.mapper.UserMapper.selectById : <== Total: 1 +2025-04-17 16:55:45.637 DEBUG 24701 --- [http-nio-9092-exec-5] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-17 16:55:45.639 DEBUG 24701 --- [http-nio-9092-exec-5] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-17 16:55:45.810 DEBUG 24701 --- [http-nio-9092-exec-5] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-17 16:55:45.824 DEBUG 24701 --- [http-nio-9092-exec-5] c.m.m.C.getAllCategoriesWithLaws : ==> Preparing: SELECT c.category_id, c.name, c.description, l.law_id, l.category_id AS law_category_id, l.title, l.summary, l.content, l.effective_date, l.reference_url FROM categories c LEFT JOIN laws l ON c.category_id = l.category_id ORDER BY c.category_id, l.law_id +2025-04-17 16:55:45.825 DEBUG 24701 --- [http-nio-9092-exec-5] c.m.m.C.getAllCategoriesWithLaws : ==> Parameters: +2025-04-17 16:55:46.308 DEBUG 24701 --- [http-nio-9092-exec-5] c.m.m.C.getAllCategoriesWithLaws : <== Total: 6 +2025-04-17 16:56:01.406 DEBUG 24701 --- [http-nio-9092-exec-6] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-17 16:56:01.407 DEBUG 24701 --- [http-nio-9092-exec-6] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-17 16:56:01.453 DEBUG 24701 --- [http-nio-9092-exec-6] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-17 16:56:01.454 DEBUG 24701 --- [http-nio-9092-exec-6] c.m.m.C.getAllCategoriesWithLaws : ==> Preparing: SELECT c.category_id, c.name, c.description, l.law_id, l.category_id AS law_category_id, l.title, l.summary, l.content, l.effective_date, l.reference_url FROM categories c LEFT JOIN laws l ON c.category_id = l.category_id ORDER BY c.category_id, l.law_id +2025-04-17 16:56:01.454 DEBUG 24701 --- [http-nio-9092-exec-6] c.m.m.C.getAllCategoriesWithLaws : ==> Parameters: +2025-04-17 16:56:01.502 DEBUG 24701 --- [http-nio-9092-exec-6] c.m.m.C.getAllCategoriesWithLaws : <== Total: 6 +2025-04-17 16:56:53.458 DEBUG 24701 --- [http-nio-9092-exec-7] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-17 16:56:53.459 DEBUG 24701 --- [http-nio-9092-exec-7] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-17 16:56:53.640 DEBUG 24701 --- [http-nio-9092-exec-7] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-17 16:56:53.642 DEBUG 24701 --- [http-nio-9092-exec-7] c.m.m.C.getAllCategoriesWithLaws : ==> Preparing: SELECT c.category_id, c.name, c.description, l.law_id, l.category_id AS law_category_id, l.title, l.summary, l.content, l.effective_date, l.reference_url FROM categories c LEFT JOIN laws l ON c.category_id = l.category_id ORDER BY c.category_id, l.law_id +2025-04-17 16:56:53.642 DEBUG 24701 --- [http-nio-9092-exec-7] c.m.m.C.getAllCategoriesWithLaws : ==> Parameters: +2025-04-17 16:56:53.962 DEBUG 24701 --- [http-nio-9092-exec-7] c.m.m.C.getAllCategoriesWithLaws : <== Total: 6 +2025-04-17 16:57:28.991 DEBUG 24701 --- [http-nio-9092-exec-8] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-17 16:57:28.992 DEBUG 24701 --- [http-nio-9092-exec-8] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-17 16:57:29.177 DEBUG 24701 --- [http-nio-9092-exec-8] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-17 16:57:29.178 DEBUG 24701 --- [http-nio-9092-exec-8] c.m.m.C.getAllCategoriesWithLaws : ==> Preparing: SELECT c.category_id, c.name, c.description, l.law_id, l.category_id AS law_category_id, l.title, l.summary, l.content, l.effective_date, l.reference_url FROM categories c LEFT JOIN laws l ON c.category_id = l.category_id ORDER BY c.category_id, l.law_id +2025-04-17 16:57:29.178 DEBUG 24701 --- [http-nio-9092-exec-8] c.m.m.C.getAllCategoriesWithLaws : ==> Parameters: +2025-04-17 16:57:29.220 DEBUG 24701 --- [http-nio-9092-exec-8] c.m.m.C.getAllCategoriesWithLaws : <== Total: 6 +2025-04-17 16:58:19.807 DEBUG 24701 --- [http-nio-9092-exec-9] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-17 16:58:19.807 DEBUG 24701 --- [http-nio-9092-exec-9] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-17 16:58:19.854 DEBUG 24701 --- [http-nio-9092-exec-9] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-17 16:58:19.895 DEBUG 24701 --- [http-nio-9092-exec-9] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM legalAidResources +2025-04-17 16:58:19.895 DEBUG 24701 --- [http-nio-9092-exec-9] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 16:58:19.947 DEBUG 24701 --- [http-nio-9092-exec-9] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 16:58:19.947 DEBUG 24701 --- [http-nio-9092-exec-9] c.m.m.L.selectList : ==> Preparing: SELECT aid_id,name,type,phone_number,email,avatar,address,website_url,is_emergency,description FROM legalAidResources LIMIT ? +2025-04-17 16:58:19.947 DEBUG 24701 --- [http-nio-9092-exec-9] c.m.m.L.selectList : ==> Parameters: 6(Integer) +2025-04-17 16:58:19.988 DEBUG 24701 --- [http-nio-9092-exec-9] c.m.m.L.selectList : <== Total: 6 +2025-04-17 16:59:14.568 DEBUG 24701 --- [http-nio-9092-exec-10] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-17 16:59:14.570 DEBUG 24701 --- [http-nio-9092-exec-10] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-17 16:59:14.614 DEBUG 24701 --- [http-nio-9092-exec-10] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-17 16:59:14.624 DEBUG 24701 --- [http-nio-9092-exec-10] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM legalAidResources +2025-04-17 16:59:14.624 DEBUG 24701 --- [http-nio-9092-exec-10] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 16:59:14.667 DEBUG 24701 --- [http-nio-9092-exec-10] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 16:59:14.667 DEBUG 24701 --- [http-nio-9092-exec-10] c.m.m.L.selectList : ==> Preparing: SELECT aid_id,name,type,phone_number,email,avatar,address,website_url,is_emergency,description FROM legalAidResources LIMIT ? +2025-04-17 16:59:14.668 DEBUG 24701 --- [http-nio-9092-exec-10] c.m.m.L.selectList : ==> Parameters: 6(Integer) +2025-04-17 16:59:14.854 DEBUG 24701 --- [http-nio-9092-exec-10] c.m.m.L.selectList : <== Total: 6 +2025-04-17 16:59:21.405 DEBUG 24701 --- [http-nio-9092-exec-2] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-17 16:59:21.406 DEBUG 24701 --- [http-nio-9092-exec-2] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-17 16:59:21.447 DEBUG 24701 --- [http-nio-9092-exec-2] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-17 16:59:21.453 DEBUG 24701 --- [http-nio-9092-exec-2] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM legalAidResources +2025-04-17 16:59:21.453 DEBUG 24701 --- [http-nio-9092-exec-2] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 16:59:21.491 DEBUG 24701 --- [http-nio-9092-exec-2] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 16:59:21.492 DEBUG 24701 --- [http-nio-9092-exec-2] c.m.m.L.selectList : ==> Preparing: SELECT aid_id,name,type,phone_number,email,avatar,address,website_url,is_emergency,description FROM legalAidResources LIMIT ? +2025-04-17 16:59:21.492 DEBUG 24701 --- [http-nio-9092-exec-2] c.m.m.L.selectList : ==> Parameters: 6(Integer) +2025-04-17 16:59:21.528 DEBUG 24701 --- [http-nio-9092-exec-2] c.m.m.L.selectList : <== Total: 6 +2025-04-17 16:59:24.381 DEBUG 24701 --- [http-nio-9092-exec-1] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-17 16:59:24.382 DEBUG 24701 --- [http-nio-9092-exec-1] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-17 16:59:24.558 DEBUG 24701 --- [http-nio-9092-exec-1] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-17 16:59:24.561 DEBUG 24701 --- [http-nio-9092-exec-1] c.m.m.C.getAllCategoriesWithLaws : ==> Preparing: SELECT c.category_id, c.name, c.description, l.law_id, l.category_id AS law_category_id, l.title, l.summary, l.content, l.effective_date, l.reference_url FROM categories c LEFT JOIN laws l ON c.category_id = l.category_id ORDER BY c.category_id, l.law_id +2025-04-17 16:59:24.562 DEBUG 24701 --- [http-nio-9092-exec-1] c.m.m.C.getAllCategoriesWithLaws : ==> Parameters: +2025-04-17 16:59:24.618 DEBUG 24701 --- [http-nio-9092-exec-1] c.m.m.C.getAllCategoriesWithLaws : <== Total: 6 +2025-04-17 17:00:20.808 DEBUG 24701 --- [http-nio-9092-exec-4] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-17 17:00:20.809 DEBUG 24701 --- [http-nio-9092-exec-4] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-17 17:00:20.851 DEBUG 24701 --- [http-nio-9092-exec-4] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-17 17:00:20.852 DEBUG 24701 --- [http-nio-9092-exec-4] c.mingchen.mapper.UserMapper.selectById : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE user_id=? +2025-04-17 17:00:20.852 DEBUG 24701 --- [http-nio-9092-exec-4] c.mingchen.mapper.UserMapper.selectById : ==> Parameters: 1(Long) +2025-04-17 17:00:20.893 DEBUG 24701 --- [http-nio-9092-exec-4] c.mingchen.mapper.UserMapper.selectById : <== Total: 1 +2025-04-17 17:00:34.711 DEBUG 24701 --- [http-nio-9092-exec-5] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-17 17:00:34.712 DEBUG 24701 --- [http-nio-9092-exec-5] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-17 17:00:34.754 DEBUG 24701 --- [http-nio-9092-exec-5] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-17 17:00:34.756 DEBUG 24701 --- [http-nio-9092-exec-5] c.mingchen.mapper.UserMapper.selectById : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE user_id=? +2025-04-17 17:00:34.756 DEBUG 24701 --- [http-nio-9092-exec-5] c.mingchen.mapper.UserMapper.selectById : ==> Parameters: 1(Long) +2025-04-17 17:00:34.789 DEBUG 24701 --- [http-nio-9092-exec-5] c.mingchen.mapper.UserMapper.selectById : <== Total: 1 +2025-04-17 17:06:01.324 DEBUG 24701 --- [http-nio-9092-exec-7] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-17 17:06:01.326 DEBUG 24701 --- [http-nio-9092-exec-7] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-17 17:06:01.370 DEBUG 24701 --- [http-nio-9092-exec-7] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-17 17:06:01.371 DEBUG 24701 --- [http-nio-9092-exec-7] c.m.m.C.getAllCategoriesWithLaws : ==> Preparing: SELECT c.category_id, c.name, c.description, l.law_id, l.category_id AS law_category_id, l.title, l.summary, l.content, l.effective_date, l.reference_url FROM categories c LEFT JOIN laws l ON c.category_id = l.category_id ORDER BY c.category_id, l.law_id +2025-04-17 17:06:01.371 DEBUG 24701 --- [http-nio-9092-exec-7] c.m.m.C.getAllCategoriesWithLaws : ==> Parameters: +2025-04-17 17:06:01.431 DEBUG 24701 --- [http-nio-9092-exec-7] c.m.m.C.getAllCategoriesWithLaws : <== Total: 6 +2025-04-17 17:07:02.151 DEBUG 24701 --- [http-nio-9092-exec-9] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-17 17:07:02.151 DEBUG 24701 --- [http-nio-9092-exec-9] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-17 17:07:02.344 DEBUG 24701 --- [http-nio-9092-exec-9] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-17 17:07:02.346 DEBUG 24701 --- [http-nio-9092-exec-9] c.mingchen.mapper.UserMapper.selectById : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE user_id=? +2025-04-17 17:07:02.346 DEBUG 24701 --- [http-nio-9092-exec-9] c.mingchen.mapper.UserMapper.selectById : ==> Parameters: 1(Long) +2025-04-17 17:07:02.780 DEBUG 24701 --- [http-nio-9092-exec-9] c.mingchen.mapper.UserMapper.selectById : <== Total: 1 +2025-04-17 17:07:05.887 DEBUG 24701 --- [http-nio-9092-exec-10] c.mingchen.common.config.JwtLoginFilter : Request is to process authentication +2025-04-17 17:07:06.205 DEBUG 24701 --- [http-nio-9092-exec-10] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-17 17:07:06.206 DEBUG 24701 --- [http-nio-9092-exec-10] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-17 17:07:06.513 DEBUG 24701 --- [http-nio-9092-exec-10] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-17 17:07:06.651 DEBUG 24701 --- [http-nio-9092-exec-2] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-17 17:07:06.652 DEBUG 24701 --- [http-nio-9092-exec-2] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-17 17:07:06.822 DEBUG 24701 --- [http-nio-9092-exec-2] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-17 17:07:06.823 DEBUG 24701 --- [http-nio-9092-exec-2] c.m.m.C.getAllCategoriesWithLaws : ==> Preparing: SELECT c.category_id, c.name, c.description, l.law_id, l.category_id AS law_category_id, l.title, l.summary, l.content, l.effective_date, l.reference_url FROM categories c LEFT JOIN laws l ON c.category_id = l.category_id ORDER BY c.category_id, l.law_id +2025-04-17 17:07:06.823 DEBUG 24701 --- [http-nio-9092-exec-2] c.m.m.C.getAllCategoriesWithLaws : ==> Parameters: +2025-04-17 17:07:07.168 DEBUG 24701 --- [http-nio-9092-exec-2] c.m.m.C.getAllCategoriesWithLaws : <== Total: 6 +2025-04-17 17:07:17.375 DEBUG 24701 --- [http-nio-9092-exec-1] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-17 17:07:17.376 DEBUG 24701 --- [http-nio-9092-exec-1] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-17 17:07:17.418 DEBUG 24701 --- [http-nio-9092-exec-1] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-17 17:07:17.419 DEBUG 24701 --- [http-nio-9092-exec-1] c.mingchen.mapper.UserMapper.selectById : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE user_id=? +2025-04-17 17:07:17.419 DEBUG 24701 --- [http-nio-9092-exec-1] c.mingchen.mapper.UserMapper.selectById : ==> Parameters: 1(Long) +2025-04-17 17:07:17.602 DEBUG 24701 --- [http-nio-9092-exec-1] c.mingchen.mapper.UserMapper.selectById : <== Total: 1 +2025-04-17 17:08:54.537 DEBUG 24701 --- [http-nio-9092-exec-4] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-17 17:08:54.538 DEBUG 24701 --- [http-nio-9092-exec-4] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-17 17:08:54.601 DEBUG 24701 --- [http-nio-9092-exec-4] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-17 17:08:54.602 DEBUG 24701 --- [http-nio-9092-exec-4] c.m.m.C.getAllCategoriesWithLaws : ==> Preparing: SELECT c.category_id, c.name, c.description, l.law_id, l.category_id AS law_category_id, l.title, l.summary, l.content, l.effective_date, l.reference_url FROM categories c LEFT JOIN laws l ON c.category_id = l.category_id ORDER BY c.category_id, l.law_id +2025-04-17 17:08:54.602 DEBUG 24701 --- [http-nio-9092-exec-4] c.m.m.C.getAllCategoriesWithLaws : ==> Parameters: +2025-04-17 17:08:54.914 DEBUG 24701 --- [http-nio-9092-exec-4] c.m.m.C.getAllCategoriesWithLaws : <== Total: 6 +2025-04-17 17:09:01.251 DEBUG 24701 --- [http-nio-9092-exec-5] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-17 17:09:01.252 DEBUG 24701 --- [http-nio-9092-exec-5] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-17 17:09:01.285 DEBUG 24701 --- [http-nio-9092-exec-5] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-17 17:09:01.286 DEBUG 24701 --- [http-nio-9092-exec-5] c.m.m.C.getAllCategoriesWithLaws : ==> Preparing: SELECT c.category_id, c.name, c.description, l.law_id, l.category_id AS law_category_id, l.title, l.summary, l.content, l.effective_date, l.reference_url FROM categories c LEFT JOIN laws l ON c.category_id = l.category_id ORDER BY c.category_id, l.law_id +2025-04-17 17:09:01.287 DEBUG 24701 --- [http-nio-9092-exec-5] c.m.m.C.getAllCategoriesWithLaws : ==> Parameters: +2025-04-17 17:09:01.381 DEBUG 24701 --- [http-nio-9092-exec-5] c.m.m.C.getAllCategoriesWithLaws : <== Total: 6 +2025-04-17 17:09:37.389 DEBUG 24701 --- [http-nio-9092-exec-6] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-17 17:09:37.391 DEBUG 24701 --- [http-nio-9092-exec-6] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-17 17:09:37.997 DEBUG 24701 --- [http-nio-9092-exec-6] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-17 17:09:37.999 DEBUG 24701 --- [http-nio-9092-exec-6] c.m.m.C.getAllCategoriesWithLaws : ==> Preparing: SELECT c.category_id, c.name, c.description, l.law_id, l.category_id AS law_category_id, l.title, l.summary, l.content, l.effective_date, l.reference_url FROM categories c LEFT JOIN laws l ON c.category_id = l.category_id ORDER BY c.category_id, l.law_id +2025-04-17 17:09:37.999 DEBUG 24701 --- [http-nio-9092-exec-6] c.m.m.C.getAllCategoriesWithLaws : ==> Parameters: +2025-04-17 17:09:38.330 DEBUG 24701 --- [http-nio-9092-exec-6] c.m.m.C.getAllCategoriesWithLaws : <== Total: 6 +2025-04-17 17:09:39.129 DEBUG 24701 --- [http-nio-9092-exec-7] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-17 17:09:39.130 DEBUG 24701 --- [http-nio-9092-exec-7] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-17 17:09:39.456 DEBUG 24701 --- [http-nio-9092-exec-7] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-17 17:09:39.462 DEBUG 24701 --- [http-nio-9092-exec-7] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM legalAidResources +2025-04-17 17:09:39.463 DEBUG 24701 --- [http-nio-9092-exec-7] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 17:09:39.644 DEBUG 24701 --- [http-nio-9092-exec-7] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 17:09:39.645 DEBUG 24701 --- [http-nio-9092-exec-7] c.m.m.L.selectList : ==> Preparing: SELECT aid_id,name,type,phone_number,email,avatar,address,website_url,is_emergency,description FROM legalAidResources LIMIT ? +2025-04-17 17:09:39.645 DEBUG 24701 --- [http-nio-9092-exec-7] c.m.m.L.selectList : ==> Parameters: 6(Integer) +2025-04-17 17:09:39.696 DEBUG 24701 --- [http-nio-9092-exec-7] c.m.m.L.selectList : <== Total: 6 +2025-04-17 17:09:42.122 DEBUG 24701 --- [http-nio-9092-exec-8] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-17 17:09:42.123 DEBUG 24701 --- [http-nio-9092-exec-8] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-17 17:09:42.175 DEBUG 24701 --- [http-nio-9092-exec-8] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-17 17:09:42.175 DEBUG 24701 --- [http-nio-9092-exec-8] c.mingchen.mapper.UserMapper.selectById : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE user_id=? +2025-04-17 17:09:42.176 DEBUG 24701 --- [http-nio-9092-exec-8] c.mingchen.mapper.UserMapper.selectById : ==> Parameters: 1(Long) +2025-04-17 17:09:42.235 DEBUG 24701 --- [http-nio-9092-exec-8] c.mingchen.mapper.UserMapper.selectById : <== Total: 1 +2025-04-17 17:10:31.569 DEBUG 24701 --- [http-nio-9092-exec-9] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-17 17:10:31.569 DEBUG 24701 --- [http-nio-9092-exec-9] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-17 17:10:31.902 DEBUG 24701 --- [http-nio-9092-exec-9] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-17 17:10:31.904 DEBUG 24701 --- [http-nio-9092-exec-9] c.m.m.C.getAllCategoriesWithLaws : ==> Preparing: SELECT c.category_id, c.name, c.description, l.law_id, l.category_id AS law_category_id, l.title, l.summary, l.content, l.effective_date, l.reference_url FROM categories c LEFT JOIN laws l ON c.category_id = l.category_id ORDER BY c.category_id, l.law_id +2025-04-17 17:10:31.904 DEBUG 24701 --- [http-nio-9092-exec-9] c.m.m.C.getAllCategoriesWithLaws : ==> Parameters: +2025-04-17 17:10:32.097 DEBUG 24701 --- [http-nio-9092-exec-9] c.m.m.C.getAllCategoriesWithLaws : <== Total: 6 +2025-04-17 17:10:35.711 DEBUG 24701 --- [http-nio-9092-exec-10] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-17 17:10:35.711 DEBUG 24701 --- [http-nio-9092-exec-10] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-17 17:10:35.750 DEBUG 24701 --- [http-nio-9092-exec-10] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-17 17:10:35.751 DEBUG 24701 --- [http-nio-9092-exec-10] c.m.m.C.getAllCategoriesWithLaws : ==> Preparing: SELECT c.category_id, c.name, c.description, l.law_id, l.category_id AS law_category_id, l.title, l.summary, l.content, l.effective_date, l.reference_url FROM categories c LEFT JOIN laws l ON c.category_id = l.category_id ORDER BY c.category_id, l.law_id +2025-04-17 17:10:35.752 DEBUG 24701 --- [http-nio-9092-exec-10] c.m.m.C.getAllCategoriesWithLaws : ==> Parameters: +2025-04-17 17:10:35.795 DEBUG 24701 --- [http-nio-9092-exec-10] c.m.m.C.getAllCategoriesWithLaws : <== Total: 6 +2025-04-17 17:10:46.371 DEBUG 24701 --- [http-nio-9092-exec-2] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-17 17:10:46.373 DEBUG 24701 --- [http-nio-9092-exec-2] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-17 17:10:46.403 DEBUG 24701 --- [http-nio-9092-exec-2] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-17 17:10:46.404 DEBUG 24701 --- [http-nio-9092-exec-2] c.m.m.C.getAllCategoriesWithLaws : ==> Preparing: SELECT c.category_id, c.name, c.description, l.law_id, l.category_id AS law_category_id, l.title, l.summary, l.content, l.effective_date, l.reference_url FROM categories c LEFT JOIN laws l ON c.category_id = l.category_id ORDER BY c.category_id, l.law_id +2025-04-17 17:10:46.404 DEBUG 24701 --- [http-nio-9092-exec-2] c.m.m.C.getAllCategoriesWithLaws : ==> Parameters: +2025-04-17 17:10:46.461 DEBUG 24701 --- [http-nio-9092-exec-2] c.m.m.C.getAllCategoriesWithLaws : <== Total: 6 +2025-04-17 17:11:14.353 DEBUG 24701 --- [http-nio-9092-exec-1] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-17 17:11:14.354 DEBUG 24701 --- [http-nio-9092-exec-1] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-17 17:11:14.517 DEBUG 24701 --- [http-nio-9092-exec-1] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-17 17:11:14.518 DEBUG 24701 --- [http-nio-9092-exec-1] c.m.m.C.getAllCategoriesWithLaws : ==> Preparing: SELECT c.category_id, c.name, c.description, l.law_id, l.category_id AS law_category_id, l.title, l.summary, l.content, l.effective_date, l.reference_url FROM categories c LEFT JOIN laws l ON c.category_id = l.category_id ORDER BY c.category_id, l.law_id +2025-04-17 17:11:14.518 DEBUG 24701 --- [http-nio-9092-exec-1] c.m.m.C.getAllCategoriesWithLaws : ==> Parameters: +2025-04-17 17:11:14.555 DEBUG 24701 --- [http-nio-9092-exec-1] c.m.m.C.getAllCategoriesWithLaws : <== Total: 6 +2025-04-17 17:11:50.622 DEBUG 24701 --- [http-nio-9092-exec-3] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-17 17:11:50.623 DEBUG 24701 --- [http-nio-9092-exec-3] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-17 17:11:50.679 DEBUG 24701 --- [http-nio-9092-exec-3] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-17 17:11:50.680 DEBUG 24701 --- [http-nio-9092-exec-3] c.m.m.C.getAllCategoriesWithLaws : ==> Preparing: SELECT c.category_id, c.name, c.description, l.law_id, l.category_id AS law_category_id, l.title, l.summary, l.content, l.effective_date, l.reference_url FROM categories c LEFT JOIN laws l ON c.category_id = l.category_id ORDER BY c.category_id, l.law_id +2025-04-17 17:11:50.680 DEBUG 24701 --- [http-nio-9092-exec-3] c.m.m.C.getAllCategoriesWithLaws : ==> Parameters: +2025-04-17 17:11:50.737 DEBUG 24701 --- [http-nio-9092-exec-3] c.m.m.C.getAllCategoriesWithLaws : <== Total: 6 +2025-04-17 17:11:57.322 DEBUG 24701 --- [http-nio-9092-exec-4] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-17 17:11:57.323 DEBUG 24701 --- [http-nio-9092-exec-4] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-17 17:11:57.359 DEBUG 24701 --- [http-nio-9092-exec-4] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-17 17:11:57.361 DEBUG 24701 --- [http-nio-9092-exec-4] c.m.m.C.getAllCategoriesWithLaws : ==> Preparing: SELECT c.category_id, c.name, c.description, l.law_id, l.category_id AS law_category_id, l.title, l.summary, l.content, l.effective_date, l.reference_url FROM categories c LEFT JOIN laws l ON c.category_id = l.category_id ORDER BY c.category_id, l.law_id +2025-04-17 17:11:57.361 DEBUG 24701 --- [http-nio-9092-exec-4] c.m.m.C.getAllCategoriesWithLaws : ==> Parameters: +2025-04-17 17:11:57.433 DEBUG 24701 --- [http-nio-9092-exec-4] c.m.m.C.getAllCategoriesWithLaws : <== Total: 6 +2025-04-17 17:12:01.683 DEBUG 24701 --- [http-nio-9092-exec-5] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-17 17:12:01.685 DEBUG 24701 --- [http-nio-9092-exec-5] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-17 17:12:01.741 DEBUG 24701 --- [http-nio-9092-exec-5] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-17 17:12:01.743 DEBUG 24701 --- [http-nio-9092-exec-5] c.m.m.C.getAllCategoriesWithLaws : ==> Preparing: SELECT c.category_id, c.name, c.description, l.law_id, l.category_id AS law_category_id, l.title, l.summary, l.content, l.effective_date, l.reference_url FROM categories c LEFT JOIN laws l ON c.category_id = l.category_id ORDER BY c.category_id, l.law_id +2025-04-17 17:12:01.743 DEBUG 24701 --- [http-nio-9092-exec-5] c.m.m.C.getAllCategoriesWithLaws : ==> Parameters: +2025-04-17 17:12:01.795 DEBUG 24701 --- [http-nio-9092-exec-5] c.m.m.C.getAllCategoriesWithLaws : <== Total: 6 +2025-04-17 17:12:08.202 DEBUG 24701 --- [http-nio-9092-exec-6] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-17 17:12:08.202 DEBUG 24701 --- [http-nio-9092-exec-6] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-17 17:12:08.250 DEBUG 24701 --- [http-nio-9092-exec-6] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-17 17:12:08.251 DEBUG 24701 --- [http-nio-9092-exec-6] c.m.m.C.getAllCategoriesWithLaws : ==> Preparing: SELECT c.category_id, c.name, c.description, l.law_id, l.category_id AS law_category_id, l.title, l.summary, l.content, l.effective_date, l.reference_url FROM categories c LEFT JOIN laws l ON c.category_id = l.category_id ORDER BY c.category_id, l.law_id +2025-04-17 17:12:08.251 DEBUG 24701 --- [http-nio-9092-exec-6] c.m.m.C.getAllCategoriesWithLaws : ==> Parameters: +2025-04-17 17:12:08.296 DEBUG 24701 --- [http-nio-9092-exec-6] c.m.m.C.getAllCategoriesWithLaws : <== Total: 6 +2025-04-17 17:12:22.642 DEBUG 24701 --- [http-nio-9092-exec-7] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-17 17:12:22.643 DEBUG 24701 --- [http-nio-9092-exec-7] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-17 17:12:22.690 DEBUG 24701 --- [http-nio-9092-exec-7] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-17 17:12:22.690 DEBUG 24701 --- [http-nio-9092-exec-7] c.m.m.C.getAllCategoriesWithLaws : ==> Preparing: SELECT c.category_id, c.name, c.description, l.law_id, l.category_id AS law_category_id, l.title, l.summary, l.content, l.effective_date, l.reference_url FROM categories c LEFT JOIN laws l ON c.category_id = l.category_id ORDER BY c.category_id, l.law_id +2025-04-17 17:12:22.691 DEBUG 24701 --- [http-nio-9092-exec-7] c.m.m.C.getAllCategoriesWithLaws : ==> Parameters: +2025-04-17 17:12:23.161 DEBUG 24701 --- [http-nio-9092-exec-7] c.m.m.C.getAllCategoriesWithLaws : <== Total: 6 +2025-04-17 17:12:28.642 DEBUG 24701 --- [http-nio-9092-exec-8] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-17 17:12:28.643 DEBUG 24701 --- [http-nio-9092-exec-8] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-17 17:12:28.968 DEBUG 24701 --- [http-nio-9092-exec-8] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-17 17:12:28.969 DEBUG 24701 --- [http-nio-9092-exec-8] c.m.m.C.getAllCategoriesWithLaws : ==> Preparing: SELECT c.category_id, c.name, c.description, l.law_id, l.category_id AS law_category_id, l.title, l.summary, l.content, l.effective_date, l.reference_url FROM categories c LEFT JOIN laws l ON c.category_id = l.category_id ORDER BY c.category_id, l.law_id +2025-04-17 17:12:28.969 DEBUG 24701 --- [http-nio-9092-exec-8] c.m.m.C.getAllCategoriesWithLaws : ==> Parameters: +2025-04-17 17:12:29.008 DEBUG 24701 --- [http-nio-9092-exec-8] c.m.m.C.getAllCategoriesWithLaws : <== Total: 6 +2025-04-17 17:12:56.017 DEBUG 24701 --- [http-nio-9092-exec-9] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-17 17:12:56.017 DEBUG 24701 --- [http-nio-9092-exec-9] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-17 17:12:56.192 DEBUG 24701 --- [http-nio-9092-exec-9] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-17 17:12:56.193 DEBUG 24701 --- [http-nio-9092-exec-9] c.m.m.C.getAllCategoriesWithLaws : ==> Preparing: SELECT c.category_id, c.name, c.description, l.law_id, l.category_id AS law_category_id, l.title, l.summary, l.content, l.effective_date, l.reference_url FROM categories c LEFT JOIN laws l ON c.category_id = l.category_id ORDER BY c.category_id, l.law_id +2025-04-17 17:12:56.194 DEBUG 24701 --- [http-nio-9092-exec-9] c.m.m.C.getAllCategoriesWithLaws : ==> Parameters: +2025-04-17 17:12:56.497 DEBUG 24701 --- [http-nio-9092-exec-9] c.m.m.C.getAllCategoriesWithLaws : <== Total: 6 +2025-04-17 17:12:57.142 DEBUG 24701 --- [http-nio-9092-exec-10] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-17 17:12:57.142 DEBUG 24701 --- [http-nio-9092-exec-10] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-17 17:12:57.190 DEBUG 24701 --- [http-nio-9092-exec-10] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-17 17:12:57.192 DEBUG 24701 --- [http-nio-9092-exec-10] c.mingchen.mapper.UserMapper.selectById : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE user_id=? +2025-04-17 17:12:57.192 DEBUG 24701 --- [http-nio-9092-exec-10] c.mingchen.mapper.UserMapper.selectById : ==> Parameters: 1(Long) +2025-04-17 17:12:57.231 DEBUG 24701 --- [http-nio-9092-exec-10] c.mingchen.mapper.UserMapper.selectById : <== Total: 1 +2025-04-17 17:13:02.742 DEBUG 24701 --- [http-nio-9092-exec-2] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-17 17:13:02.742 DEBUG 24701 --- [http-nio-9092-exec-2] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-17 17:13:02.799 DEBUG 24701 --- [http-nio-9092-exec-2] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-17 17:13:02.799 DEBUG 24701 --- [http-nio-9092-exec-2] c.m.m.C.getAllCategoriesWithLaws : ==> Preparing: SELECT c.category_id, c.name, c.description, l.law_id, l.category_id AS law_category_id, l.title, l.summary, l.content, l.effective_date, l.reference_url FROM categories c LEFT JOIN laws l ON c.category_id = l.category_id ORDER BY c.category_id, l.law_id +2025-04-17 17:13:02.800 DEBUG 24701 --- [http-nio-9092-exec-2] c.m.m.C.getAllCategoriesWithLaws : ==> Parameters: +2025-04-17 17:13:02.854 DEBUG 24701 --- [http-nio-9092-exec-2] c.m.m.C.getAllCategoriesWithLaws : <== Total: 6 +2025-04-17 17:13:03.842 DEBUG 24701 --- [http-nio-9092-exec-1] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-17 17:13:03.845 DEBUG 24701 --- [http-nio-9092-exec-1] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-17 17:13:03.890 DEBUG 24701 --- [http-nio-9092-exec-1] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-17 17:13:03.891 DEBUG 24701 --- [http-nio-9092-exec-1] c.mingchen.mapper.UserMapper.selectById : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE user_id=? +2025-04-17 17:13:03.891 DEBUG 24701 --- [http-nio-9092-exec-1] c.mingchen.mapper.UserMapper.selectById : ==> Parameters: 1(Long) +2025-04-17 17:13:03.923 DEBUG 24701 --- [http-nio-9092-exec-1] c.mingchen.mapper.UserMapper.selectById : <== Total: 1 +2025-04-17 17:14:41.486 DEBUG 24701 --- [http-nio-9092-exec-5] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-17 17:14:41.487 DEBUG 24701 --- [http-nio-9092-exec-5] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-17 17:14:41.534 DEBUG 24701 --- [http-nio-9092-exec-5] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-17 17:14:41.535 DEBUG 24701 --- [http-nio-9092-exec-5] c.m.m.C.getAllCategoriesWithLaws : ==> Preparing: SELECT c.category_id, c.name, c.description, l.law_id, l.category_id AS law_category_id, l.title, l.summary, l.content, l.effective_date, l.reference_url FROM categories c LEFT JOIN laws l ON c.category_id = l.category_id ORDER BY c.category_id, l.law_id +2025-04-17 17:14:41.535 DEBUG 24701 --- [http-nio-9092-exec-5] c.m.m.C.getAllCategoriesWithLaws : ==> Parameters: +2025-04-17 17:14:41.594 DEBUG 24701 --- [http-nio-9092-exec-5] c.m.m.C.getAllCategoriesWithLaws : <== Total: 6 +2025-04-17 17:15:04.813 DEBUG 24701 --- [http-nio-9092-exec-6] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-17 17:15:04.813 DEBUG 24701 --- [http-nio-9092-exec-6] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-17 17:15:04.847 DEBUG 24701 --- [http-nio-9092-exec-6] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-17 17:15:04.848 DEBUG 24701 --- [http-nio-9092-exec-6] c.m.m.C.getAllCategoriesWithLaws : ==> Preparing: SELECT c.category_id, c.name, c.description, l.law_id, l.category_id AS law_category_id, l.title, l.summary, l.content, l.effective_date, l.reference_url FROM categories c LEFT JOIN laws l ON c.category_id = l.category_id ORDER BY c.category_id, l.law_id +2025-04-17 17:15:04.848 DEBUG 24701 --- [http-nio-9092-exec-6] c.m.m.C.getAllCategoriesWithLaws : ==> Parameters: +2025-04-17 17:15:04.892 DEBUG 24701 --- [http-nio-9092-exec-6] c.m.m.C.getAllCategoriesWithLaws : <== Total: 6 +2025-04-17 17:15:06.763 DEBUG 24701 --- [http-nio-9092-exec-7] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-17 17:15:06.763 DEBUG 24701 --- [http-nio-9092-exec-7] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-17 17:15:06.820 DEBUG 24701 --- [http-nio-9092-exec-7] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-17 17:15:06.821 DEBUG 24701 --- [http-nio-9092-exec-7] c.mingchen.mapper.UserMapper.selectById : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE user_id=? +2025-04-17 17:15:06.821 DEBUG 24701 --- [http-nio-9092-exec-7] c.mingchen.mapper.UserMapper.selectById : ==> Parameters: 1(Long) +2025-04-17 17:15:07.026 DEBUG 24701 --- [http-nio-9092-exec-7] c.mingchen.mapper.UserMapper.selectById : <== Total: 1 +2025-04-17 17:15:59.141 DEBUG 24701 --- [http-nio-9092-exec-9] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-17 17:15:59.142 DEBUG 24701 --- [http-nio-9092-exec-9] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-17 17:15:59.196 DEBUG 24701 --- [http-nio-9092-exec-9] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-17 17:15:59.206 DEBUG 24701 --- [http-nio-9092-exec-9] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM learning_resources +2025-04-17 17:15:59.206 DEBUG 24701 --- [http-nio-9092-exec-9] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 17:15:59.254 DEBUG 24701 --- [http-nio-9092-exec-9] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 17:15:59.254 DEBUG 24701 --- [http-nio-9092-exec-9] c.m.m.L.selectList : ==> Preparing: SELECT resource_id,title,type,url,duration,description FROM learning_resources LIMIT ? +2025-04-17 17:15:59.255 DEBUG 24701 --- [http-nio-9092-exec-9] c.m.m.L.selectList : ==> Parameters: 2(Integer) +2025-04-17 17:15:59.417 DEBUG 24701 --- [http-nio-9092-exec-9] c.m.m.L.selectList : <== Total: 2 +2025-04-17 17:15:59.732 DEBUG 24701 --- [http-nio-9092-exec-2] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-17 17:15:59.732 DEBUG 24701 --- [http-nio-9092-exec-2] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-17 17:15:59.792 DEBUG 24701 --- [http-nio-9092-exec-2] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-17 17:15:59.798 DEBUG 24701 --- [http-nio-9092-exec-2] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM legalAidResources +2025-04-17 17:15:59.798 DEBUG 24701 --- [http-nio-9092-exec-2] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 17:15:59.842 DEBUG 24701 --- [http-nio-9092-exec-2] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 17:15:59.842 DEBUG 24701 --- [http-nio-9092-exec-2] c.m.m.L.selectList : ==> Preparing: SELECT aid_id,name,type,phone_number,email,avatar,address,website_url,is_emergency,description FROM legalAidResources LIMIT ? +2025-04-17 17:15:59.843 DEBUG 24701 --- [http-nio-9092-exec-2] c.m.m.L.selectList : ==> Parameters: 6(Integer) +2025-04-17 17:15:59.889 DEBUG 24701 --- [http-nio-9092-exec-2] c.m.m.L.selectList : <== Total: 6 +2025-04-17 17:16:00.540 DEBUG 24701 --- [http-nio-9092-exec-1] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-17 17:16:00.540 DEBUG 24701 --- [http-nio-9092-exec-1] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-17 17:16:00.588 DEBUG 24701 --- [http-nio-9092-exec-1] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-17 17:16:00.589 DEBUG 24701 --- [http-nio-9092-exec-1] c.mingchen.mapper.UserMapper.selectById : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE user_id=? +2025-04-17 17:16:00.589 DEBUG 24701 --- [http-nio-9092-exec-1] c.mingchen.mapper.UserMapper.selectById : ==> Parameters: 1(Long) +2025-04-17 17:16:00.633 DEBUG 24701 --- [http-nio-9092-exec-1] c.mingchen.mapper.UserMapper.selectById : <== Total: 1 +2025-04-17 17:16:00.930 DEBUG 24701 --- [http-nio-9092-exec-3] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-17 17:16:00.930 DEBUG 24701 --- [http-nio-9092-exec-3] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-17 17:16:01.124 DEBUG 24701 --- [http-nio-9092-exec-3] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-17 17:16:01.131 DEBUG 24701 --- [http-nio-9092-exec-3] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM legalAidResources +2025-04-17 17:16:01.131 DEBUG 24701 --- [http-nio-9092-exec-3] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 17:16:01.163 DEBUG 24701 --- [http-nio-9092-exec-3] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 17:16:01.164 DEBUG 24701 --- [http-nio-9092-exec-3] c.m.m.L.selectList : ==> Preparing: SELECT aid_id,name,type,phone_number,email,avatar,address,website_url,is_emergency,description FROM legalAidResources LIMIT ? +2025-04-17 17:16:01.164 DEBUG 24701 --- [http-nio-9092-exec-3] c.m.m.L.selectList : ==> Parameters: 6(Integer) +2025-04-17 17:16:01.202 DEBUG 24701 --- [http-nio-9092-exec-3] c.m.m.L.selectList : <== Total: 6 +2025-04-17 17:16:01.480 DEBUG 24701 --- [http-nio-9092-exec-4] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-17 17:16:01.480 DEBUG 24701 --- [http-nio-9092-exec-4] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-17 17:16:01.544 DEBUG 24701 --- [http-nio-9092-exec-4] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-17 17:16:01.548 DEBUG 24701 --- [http-nio-9092-exec-4] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM learning_resources +2025-04-17 17:16:01.549 DEBUG 24701 --- [http-nio-9092-exec-4] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 17:16:01.601 DEBUG 24701 --- [http-nio-9092-exec-4] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 17:16:01.601 DEBUG 24701 --- [http-nio-9092-exec-4] c.m.m.L.selectList : ==> Preparing: SELECT resource_id,title,type,url,duration,description FROM learning_resources LIMIT ? +2025-04-17 17:16:01.601 DEBUG 24701 --- [http-nio-9092-exec-4] c.m.m.L.selectList : ==> Parameters: 2(Integer) +2025-04-17 17:16:01.642 DEBUG 24701 --- [http-nio-9092-exec-4] c.m.m.L.selectList : <== Total: 2 +2025-04-17 17:16:02.561 DEBUG 24701 --- [http-nio-9092-exec-5] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-17 17:16:02.563 DEBUG 24701 --- [http-nio-9092-exec-5] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-17 17:16:02.624 DEBUG 24701 --- [http-nio-9092-exec-5] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-17 17:16:02.629 DEBUG 24701 --- [http-nio-9092-exec-5] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM legalAidResources +2025-04-17 17:16:02.630 DEBUG 24701 --- [http-nio-9092-exec-5] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 17:16:02.669 DEBUG 24701 --- [http-nio-9092-exec-5] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 17:16:02.669 DEBUG 24701 --- [http-nio-9092-exec-5] c.m.m.L.selectList : ==> Preparing: SELECT aid_id,name,type,phone_number,email,avatar,address,website_url,is_emergency,description FROM legalAidResources LIMIT ? +2025-04-17 17:16:02.670 DEBUG 24701 --- [http-nio-9092-exec-5] c.m.m.L.selectList : ==> Parameters: 6(Integer) +2025-04-17 17:16:02.713 DEBUG 24701 --- [http-nio-9092-exec-5] c.m.m.L.selectList : <== Total: 6 +2025-04-17 17:16:03.581 DEBUG 24701 --- [http-nio-9092-exec-6] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-17 17:16:03.582 DEBUG 24701 --- [http-nio-9092-exec-6] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-17 17:16:03.641 DEBUG 24701 --- [http-nio-9092-exec-6] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-17 17:16:03.642 DEBUG 24701 --- [http-nio-9092-exec-6] c.mingchen.mapper.UserMapper.selectById : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE user_id=? +2025-04-17 17:16:03.643 DEBUG 24701 --- [http-nio-9092-exec-6] c.mingchen.mapper.UserMapper.selectById : ==> Parameters: 1(Long) +2025-04-17 17:16:03.836 DEBUG 24701 --- [http-nio-9092-exec-6] c.mingchen.mapper.UserMapper.selectById : <== Total: 1 +2025-04-17 17:16:05.522 DEBUG 24701 --- [http-nio-9092-exec-7] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-17 17:16:05.522 DEBUG 24701 --- [http-nio-9092-exec-7] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-17 17:16:05.579 DEBUG 24701 --- [http-nio-9092-exec-7] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-17 17:16:05.585 DEBUG 24701 --- [http-nio-9092-exec-7] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM legalAidResources +2025-04-17 17:16:05.586 DEBUG 24701 --- [http-nio-9092-exec-7] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 17:16:05.622 DEBUG 24701 --- [http-nio-9092-exec-7] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 17:16:05.623 DEBUG 24701 --- [http-nio-9092-exec-7] c.m.m.L.selectList : ==> Preparing: SELECT aid_id,name,type,phone_number,email,avatar,address,website_url,is_emergency,description FROM legalAidResources LIMIT ? +2025-04-17 17:16:05.623 DEBUG 24701 --- [http-nio-9092-exec-7] c.m.m.L.selectList : ==> Parameters: 6(Integer) +2025-04-17 17:16:05.812 DEBUG 24701 --- [http-nio-9092-exec-7] c.m.m.L.selectList : <== Total: 6 +2025-04-17 17:16:07.460 DEBUG 24701 --- [http-nio-9092-exec-8] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-17 17:16:07.461 DEBUG 24701 --- [http-nio-9092-exec-8] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-17 17:16:07.509 DEBUG 24701 --- [http-nio-9092-exec-8] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-17 17:16:07.514 DEBUG 24701 --- [http-nio-9092-exec-8] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM learning_resources +2025-04-17 17:16:07.515 DEBUG 24701 --- [http-nio-9092-exec-8] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 17:16:07.963 DEBUG 24701 --- [http-nio-9092-exec-8] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 17:16:07.964 DEBUG 24701 --- [http-nio-9092-exec-8] c.m.m.L.selectList : ==> Preparing: SELECT resource_id,title,type,url,duration,description FROM learning_resources LIMIT ? +2025-04-17 17:16:07.964 DEBUG 24701 --- [http-nio-9092-exec-8] c.m.m.L.selectList : ==> Parameters: 2(Integer) +2025-04-17 17:16:08.009 DEBUG 24701 --- [http-nio-9092-exec-8] c.m.m.L.selectList : <== Total: 2 +2025-04-17 17:17:45.857 DEBUG 24701 --- [http-nio-9092-exec-10] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-17 17:17:45.858 DEBUG 24701 --- [http-nio-9092-exec-10] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-17 17:17:45.913 DEBUG 24701 --- [http-nio-9092-exec-10] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-17 17:17:45.913 DEBUG 24701 --- [http-nio-9092-exec-10] c.m.m.C.getAllCategoriesWithLaws : ==> Preparing: SELECT c.category_id, c.name, c.description, l.law_id, l.category_id AS law_category_id, l.title, l.summary, l.content, l.effective_date, l.reference_url FROM categories c LEFT JOIN laws l ON c.category_id = l.category_id ORDER BY c.category_id, l.law_id +2025-04-17 17:17:45.913 DEBUG 24701 --- [http-nio-9092-exec-10] c.m.m.C.getAllCategoriesWithLaws : ==> Parameters: +2025-04-17 17:17:46.261 DEBUG 24701 --- [http-nio-9092-exec-10] c.m.m.C.getAllCategoriesWithLaws : <== Total: 6 +2025-04-17 17:18:04.953 DEBUG 24701 --- [http-nio-9092-exec-2] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-17 17:18:04.954 DEBUG 24701 --- [http-nio-9092-exec-2] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-17 17:18:05.761 DEBUG 24701 --- [http-nio-9092-exec-2] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-17 17:18:05.762 DEBUG 24701 --- [http-nio-9092-exec-2] c.m.m.C.getAllCategoriesWithLaws : ==> Preparing: SELECT c.category_id, c.name, c.description, l.law_id, l.category_id AS law_category_id, l.title, l.summary, l.content, l.effective_date, l.reference_url FROM categories c LEFT JOIN laws l ON c.category_id = l.category_id ORDER BY c.category_id, l.law_id +2025-04-17 17:18:05.762 DEBUG 24701 --- [http-nio-9092-exec-2] c.m.m.C.getAllCategoriesWithLaws : ==> Parameters: +2025-04-17 17:18:05.910 DEBUG 24701 --- [http-nio-9092-exec-2] c.m.m.C.getAllCategoriesWithLaws : <== Total: 6 +2025-04-17 17:18:56.660 DEBUG 24701 --- [http-nio-9092-exec-1] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-17 17:18:56.661 DEBUG 24701 --- [http-nio-9092-exec-1] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-17 17:18:56.691 DEBUG 24701 --- [http-nio-9092-exec-1] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-17 17:18:56.692 DEBUG 24701 --- [http-nio-9092-exec-1] c.m.m.C.getAllCategoriesWithLaws : ==> Preparing: SELECT c.category_id, c.name, c.description, l.law_id, l.category_id AS law_category_id, l.title, l.summary, l.content, l.effective_date, l.reference_url FROM categories c LEFT JOIN laws l ON c.category_id = l.category_id ORDER BY c.category_id, l.law_id +2025-04-17 17:18:56.692 DEBUG 24701 --- [http-nio-9092-exec-1] c.m.m.C.getAllCategoriesWithLaws : ==> Parameters: +2025-04-17 17:18:56.744 DEBUG 24701 --- [http-nio-9092-exec-1] c.m.m.C.getAllCategoriesWithLaws : <== Total: 6 +2025-04-17 17:19:49.895 DEBUG 24701 --- [http-nio-9092-exec-3] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-17 17:19:49.897 DEBUG 24701 --- [http-nio-9092-exec-3] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-17 17:19:49.932 DEBUG 24701 --- [http-nio-9092-exec-3] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-17 17:19:49.938 DEBUG 24701 --- [http-nio-9092-exec-3] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM learning_resources +2025-04-17 17:19:49.939 DEBUG 24701 --- [http-nio-9092-exec-3] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 17:19:49.977 DEBUG 24701 --- [http-nio-9092-exec-3] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 17:19:49.978 DEBUG 24701 --- [http-nio-9092-exec-3] c.m.m.L.selectList : ==> Preparing: SELECT resource_id,title,type,url,duration,description FROM learning_resources LIMIT ? +2025-04-17 17:19:49.978 DEBUG 24701 --- [http-nio-9092-exec-3] c.m.m.L.selectList : ==> Parameters: 2(Integer) +2025-04-17 17:19:50.017 DEBUG 24701 --- [http-nio-9092-exec-3] c.m.m.L.selectList : <== Total: 2 +2025-04-17 17:20:04.395 DEBUG 24701 --- [http-nio-9092-exec-4] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-17 17:20:04.395 DEBUG 24701 --- [http-nio-9092-exec-4] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-17 17:20:04.441 DEBUG 24701 --- [http-nio-9092-exec-4] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-17 17:20:04.442 DEBUG 24701 --- [http-nio-9092-exec-4] c.m.m.C.getAllCategoriesWithLaws : ==> Preparing: SELECT c.category_id, c.name, c.description, l.law_id, l.category_id AS law_category_id, l.title, l.summary, l.content, l.effective_date, l.reference_url FROM categories c LEFT JOIN laws l ON c.category_id = l.category_id ORDER BY c.category_id, l.law_id +2025-04-17 17:20:04.443 DEBUG 24701 --- [http-nio-9092-exec-4] c.m.m.C.getAllCategoriesWithLaws : ==> Parameters: +2025-04-17 17:20:04.489 DEBUG 24701 --- [http-nio-9092-exec-4] c.m.m.C.getAllCategoriesWithLaws : <== Total: 6 +2025-04-17 17:20:05.752 DEBUG 24701 --- [http-nio-9092-exec-5] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-17 17:20:05.753 DEBUG 24701 --- [http-nio-9092-exec-5] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-17 17:20:05.809 DEBUG 24701 --- [http-nio-9092-exec-5] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-17 17:20:05.815 DEBUG 24701 --- [http-nio-9092-exec-5] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM learning_resources +2025-04-17 17:20:05.815 DEBUG 24701 --- [http-nio-9092-exec-5] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 17:20:05.863 DEBUG 24701 --- [http-nio-9092-exec-5] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 17:20:05.864 DEBUG 24701 --- [http-nio-9092-exec-5] c.m.m.L.selectList : ==> Preparing: SELECT resource_id,title,type,url,duration,description FROM learning_resources LIMIT ? +2025-04-17 17:20:05.864 DEBUG 24701 --- [http-nio-9092-exec-5] c.m.m.L.selectList : ==> Parameters: 2(Integer) +2025-04-17 17:20:05.905 DEBUG 24701 --- [http-nio-9092-exec-5] c.m.m.L.selectList : <== Total: 2 +2025-04-17 17:20:08.480 DEBUG 24701 --- [http-nio-9092-exec-6] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-17 17:20:08.481 DEBUG 24701 --- [http-nio-9092-exec-6] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-17 17:20:08.510 DEBUG 24701 --- [http-nio-9092-exec-6] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-17 17:20:08.516 DEBUG 24701 --- [http-nio-9092-exec-6] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM legalAidResources +2025-04-17 17:20:08.516 DEBUG 24701 --- [http-nio-9092-exec-6] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 17:20:08.557 DEBUG 24701 --- [http-nio-9092-exec-6] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 17:20:08.557 DEBUG 24701 --- [http-nio-9092-exec-6] c.m.m.L.selectList : ==> Preparing: SELECT aid_id,name,type,phone_number,email,avatar,address,website_url,is_emergency,description FROM legalAidResources LIMIT ? +2025-04-17 17:20:08.558 DEBUG 24701 --- [http-nio-9092-exec-6] c.m.m.L.selectList : ==> Parameters: 6(Integer) +2025-04-17 17:20:08.603 DEBUG 24701 --- [http-nio-9092-exec-6] c.m.m.L.selectList : <== Total: 6 +2025-04-17 17:20:56.732 DEBUG 24701 --- [http-nio-9092-exec-7] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-17 17:20:56.732 DEBUG 24701 --- [http-nio-9092-exec-7] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-17 17:20:56.771 DEBUG 24701 --- [http-nio-9092-exec-7] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-17 17:20:56.772 DEBUG 24701 --- [http-nio-9092-exec-7] c.m.m.C.getAllCategoriesWithLaws : ==> Preparing: SELECT c.category_id, c.name, c.description, l.law_id, l.category_id AS law_category_id, l.title, l.summary, l.content, l.effective_date, l.reference_url FROM categories c LEFT JOIN laws l ON c.category_id = l.category_id ORDER BY c.category_id, l.law_id +2025-04-17 17:20:56.772 DEBUG 24701 --- [http-nio-9092-exec-7] c.m.m.C.getAllCategoriesWithLaws : ==> Parameters: +2025-04-17 17:20:56.817 DEBUG 24701 --- [http-nio-9092-exec-7] c.m.m.C.getAllCategoriesWithLaws : <== Total: 6 +2025-04-17 17:20:57.990 DEBUG 24701 --- [http-nio-9092-exec-8] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-17 17:20:57.991 DEBUG 24701 --- [http-nio-9092-exec-8] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-17 17:20:58.030 DEBUG 24701 --- [http-nio-9092-exec-8] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-17 17:20:58.034 DEBUG 24701 --- [http-nio-9092-exec-8] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM learning_resources +2025-04-17 17:20:58.035 DEBUG 24701 --- [http-nio-9092-exec-8] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 17:20:58.072 DEBUG 24701 --- [http-nio-9092-exec-8] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 17:20:58.072 DEBUG 24701 --- [http-nio-9092-exec-8] c.m.m.L.selectList : ==> Preparing: SELECT resource_id,title,type,url,duration,description FROM learning_resources LIMIT ? +2025-04-17 17:20:58.073 DEBUG 24701 --- [http-nio-9092-exec-8] c.m.m.L.selectList : ==> Parameters: 2(Integer) +2025-04-17 17:20:58.110 DEBUG 24701 --- [http-nio-9092-exec-8] c.m.m.L.selectList : <== Total: 2 +2025-04-17 17:21:17.431 DEBUG 24701 --- [http-nio-9092-exec-9] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-17 17:21:17.432 DEBUG 24701 --- [http-nio-9092-exec-9] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-17 17:21:17.472 DEBUG 24701 --- [http-nio-9092-exec-9] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-17 17:21:17.472 DEBUG 24701 --- [http-nio-9092-exec-9] c.m.m.C.getAllCategoriesWithLaws : ==> Preparing: SELECT c.category_id, c.name, c.description, l.law_id, l.category_id AS law_category_id, l.title, l.summary, l.content, l.effective_date, l.reference_url FROM categories c LEFT JOIN laws l ON c.category_id = l.category_id ORDER BY c.category_id, l.law_id +2025-04-17 17:21:17.472 DEBUG 24701 --- [http-nio-9092-exec-9] c.m.m.C.getAllCategoriesWithLaws : ==> Parameters: +2025-04-17 17:21:17.516 DEBUG 24701 --- [http-nio-9092-exec-9] c.m.m.C.getAllCategoriesWithLaws : <== Total: 6 +2025-04-17 17:22:08.530 DEBUG 24701 --- [http-nio-9092-exec-10] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-17 17:22:08.530 DEBUG 24701 --- [http-nio-9092-exec-10] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-17 17:22:08.572 DEBUG 24701 --- [http-nio-9092-exec-10] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-17 17:22:08.573 DEBUG 24701 --- [http-nio-9092-exec-10] c.m.m.C.getAllCategoriesWithLaws : ==> Preparing: SELECT c.category_id, c.name, c.description, l.law_id, l.category_id AS law_category_id, l.title, l.summary, l.content, l.effective_date, l.reference_url FROM categories c LEFT JOIN laws l ON c.category_id = l.category_id ORDER BY c.category_id, l.law_id +2025-04-17 17:22:08.573 DEBUG 24701 --- [http-nio-9092-exec-10] c.m.m.C.getAllCategoriesWithLaws : ==> Parameters: +2025-04-17 17:22:08.618 DEBUG 24701 --- [http-nio-9092-exec-10] c.m.m.C.getAllCategoriesWithLaws : <== Total: 6 +2025-04-17 17:22:22.401 DEBUG 24701 --- [http-nio-9092-exec-2] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-17 17:22:22.402 DEBUG 24701 --- [http-nio-9092-exec-2] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-17 17:22:22.440 DEBUG 24701 --- [http-nio-9092-exec-2] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-17 17:22:22.441 DEBUG 24701 --- [http-nio-9092-exec-2] c.m.m.C.getAllCategoriesWithLaws : ==> Preparing: SELECT c.category_id, c.name, c.description, l.law_id, l.category_id AS law_category_id, l.title, l.summary, l.content, l.effective_date, l.reference_url FROM categories c LEFT JOIN laws l ON c.category_id = l.category_id ORDER BY c.category_id, l.law_id +2025-04-17 17:22:22.441 DEBUG 24701 --- [http-nio-9092-exec-2] c.m.m.C.getAllCategoriesWithLaws : ==> Parameters: +2025-04-17 17:22:22.493 DEBUG 24701 --- [http-nio-9092-exec-2] c.m.m.C.getAllCategoriesWithLaws : <== Total: 6 +2025-04-17 17:22:46.152 DEBUG 24701 --- [http-nio-9092-exec-1] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-17 17:22:46.152 DEBUG 24701 --- [http-nio-9092-exec-1] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-17 17:22:46.191 DEBUG 24701 --- [http-nio-9092-exec-1] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-17 17:22:46.192 DEBUG 24701 --- [http-nio-9092-exec-1] c.m.m.C.getAllCategoriesWithLaws : ==> Preparing: SELECT c.category_id, c.name, c.description, l.law_id, l.category_id AS law_category_id, l.title, l.summary, l.content, l.effective_date, l.reference_url FROM categories c LEFT JOIN laws l ON c.category_id = l.category_id ORDER BY c.category_id, l.law_id +2025-04-17 17:22:46.192 DEBUG 24701 --- [http-nio-9092-exec-1] c.m.m.C.getAllCategoriesWithLaws : ==> Parameters: +2025-04-17 17:22:46.235 DEBUG 24701 --- [http-nio-9092-exec-1] c.m.m.C.getAllCategoriesWithLaws : <== Total: 6 +2025-04-17 17:23:47.338 WARN 24701 --- [http-nio-9092-exec-3] com.zaxxer.hikari.pool.PoolBase : HikariPool-1 - Failed to validate connection com.mysql.cj.jdbc.ConnectionImpl@5463f28f (No operations allowed after connection closed.). Possibly consider using a shorter maxLifetime value. +2025-04-17 17:23:47.945 WARN 24701 --- [http-nio-9092-exec-4] com.zaxxer.hikari.pool.PoolBase : HikariPool-1 - Failed to validate connection com.mysql.cj.jdbc.ConnectionImpl@43513e94 (No operations allowed after connection closed.). Possibly consider using a shorter maxLifetime value. +2025-04-17 17:23:49.232 DEBUG 24701 --- [http-nio-9092-exec-4] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-17 17:23:49.233 DEBUG 24701 --- [http-nio-9092-exec-4] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-17 17:23:49.241 DEBUG 24701 --- [http-nio-9092-exec-3] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-17 17:23:49.241 DEBUG 24701 --- [http-nio-9092-exec-3] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-17 17:23:49.287 DEBUG 24701 --- [http-nio-9092-exec-4] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-17 17:23:49.292 DEBUG 24701 --- [http-nio-9092-exec-4] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM learning_resources +2025-04-17 17:23:49.293 DEBUG 24701 --- [http-nio-9092-exec-4] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 17:23:49.300 DEBUG 24701 --- [http-nio-9092-exec-3] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-17 17:23:49.302 DEBUG 24701 --- [http-nio-9092-exec-3] c.m.m.C.getAllCategoriesWithLaws : ==> Preparing: SELECT c.category_id, c.name, c.description, l.law_id, l.category_id AS law_category_id, l.title, l.summary, l.content, l.effective_date, l.reference_url FROM categories c LEFT JOIN laws l ON c.category_id = l.category_id ORDER BY c.category_id, l.law_id +2025-04-17 17:23:49.302 DEBUG 24701 --- [http-nio-9092-exec-3] c.m.m.C.getAllCategoriesWithLaws : ==> Parameters: +2025-04-17 17:23:49.333 DEBUG 24701 --- [http-nio-9092-exec-4] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 17:23:49.334 DEBUG 24701 --- [http-nio-9092-exec-4] c.m.m.L.selectList : ==> Preparing: SELECT resource_id,title,type,url,duration,description FROM learning_resources LIMIT ? +2025-04-17 17:23:49.335 DEBUG 24701 --- [http-nio-9092-exec-4] c.m.m.L.selectList : ==> Parameters: 2(Integer) +2025-04-17 17:23:49.372 DEBUG 24701 --- [http-nio-9092-exec-4] c.m.m.L.selectList : <== Total: 2 +2025-04-17 17:23:49.372 DEBUG 24701 --- [http-nio-9092-exec-3] c.m.m.C.getAllCategoriesWithLaws : <== Total: 6 +2025-04-17 17:23:49.527 WARN 24701 --- [http-nio-9092-exec-5] com.zaxxer.hikari.pool.PoolBase : HikariPool-1 - Failed to validate connection com.mysql.cj.jdbc.ConnectionImpl@34b942eb (No operations allowed after connection closed.). Possibly consider using a shorter maxLifetime value. +2025-04-17 17:23:49.527 DEBUG 24701 --- [http-nio-9092-exec-5] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-17 17:23:49.527 DEBUG 24701 --- [http-nio-9092-exec-5] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-17 17:23:49.565 DEBUG 24701 --- [http-nio-9092-exec-5] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-17 17:23:49.569 DEBUG 24701 --- [http-nio-9092-exec-5] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM legalAidResources +2025-04-17 17:23:49.569 DEBUG 24701 --- [http-nio-9092-exec-5] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 17:23:49.605 DEBUG 24701 --- [http-nio-9092-exec-5] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 17:23:49.605 DEBUG 24701 --- [http-nio-9092-exec-5] c.m.m.L.selectList : ==> Preparing: SELECT aid_id,name,type,phone_number,email,avatar,address,website_url,is_emergency,description FROM legalAidResources LIMIT ? +2025-04-17 17:23:49.606 DEBUG 24701 --- [http-nio-9092-exec-5] c.m.m.L.selectList : ==> Parameters: 6(Integer) +2025-04-17 17:23:49.639 DEBUG 24701 --- [http-nio-9092-exec-5] c.m.m.L.selectList : <== Total: 6 +2025-04-17 17:23:51.859 DEBUG 24701 --- [http-nio-9092-exec-6] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-17 17:23:51.860 DEBUG 24701 --- [http-nio-9092-exec-6] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-17 17:23:51.895 DEBUG 24701 --- [http-nio-9092-exec-6] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-17 17:23:51.896 DEBUG 24701 --- [http-nio-9092-exec-6] c.mingchen.mapper.UserMapper.selectById : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE user_id=? +2025-04-17 17:23:51.897 DEBUG 24701 --- [http-nio-9092-exec-6] c.mingchen.mapper.UserMapper.selectById : ==> Parameters: 1(Long) +2025-04-17 17:23:51.929 DEBUG 24701 --- [http-nio-9092-exec-6] c.mingchen.mapper.UserMapper.selectById : <== Total: 1 +2025-04-17 17:23:53.208 DEBUG 24701 --- [http-nio-9092-exec-7] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-17 17:23:53.208 DEBUG 24701 --- [http-nio-9092-exec-7] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-17 17:23:53.239 DEBUG 24701 --- [http-nio-9092-exec-7] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-17 17:23:53.244 DEBUG 24701 --- [http-nio-9092-exec-7] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM learning_resources +2025-04-17 17:23:53.244 DEBUG 24701 --- [http-nio-9092-exec-7] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 17:23:53.279 DEBUG 24701 --- [http-nio-9092-exec-7] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 17:23:53.280 DEBUG 24701 --- [http-nio-9092-exec-7] c.m.m.L.selectList : ==> Preparing: SELECT resource_id,title,type,url,duration,description FROM learning_resources LIMIT ? +2025-04-17 17:23:53.280 DEBUG 24701 --- [http-nio-9092-exec-7] c.m.m.L.selectList : ==> Parameters: 2(Integer) +2025-04-17 17:23:53.320 DEBUG 24701 --- [http-nio-9092-exec-7] c.m.m.L.selectList : <== Total: 2 +2025-04-17 17:23:57.789 DEBUG 24701 --- [http-nio-9092-exec-8] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-17 17:23:57.790 DEBUG 24701 --- [http-nio-9092-exec-8] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-17 17:23:57.821 DEBUG 24701 --- [http-nio-9092-exec-8] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-17 17:23:57.825 DEBUG 24701 --- [http-nio-9092-exec-8] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM learning_resources +2025-04-17 17:23:57.826 DEBUG 24701 --- [http-nio-9092-exec-8] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 17:23:57.861 DEBUG 24701 --- [http-nio-9092-exec-8] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 17:23:57.861 DEBUG 24701 --- [http-nio-9092-exec-8] c.m.m.L.selectList : ==> Preparing: SELECT resource_id,title,type,url,duration,description FROM learning_resources LIMIT ? +2025-04-17 17:23:57.862 DEBUG 24701 --- [http-nio-9092-exec-8] c.m.m.L.selectList : ==> Parameters: 2(Integer) +2025-04-17 17:23:57.901 DEBUG 24701 --- [http-nio-9092-exec-8] c.m.m.L.selectList : <== Total: 2 +2025-04-17 17:24:01.317 DEBUG 24701 --- [http-nio-9092-exec-9] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-17 17:24:01.318 DEBUG 24701 --- [http-nio-9092-exec-9] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-17 17:24:01.348 DEBUG 24701 --- [http-nio-9092-exec-9] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-17 17:24:01.354 DEBUG 24701 --- [http-nio-9092-exec-9] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM legalAidResources +2025-04-17 17:24:01.355 DEBUG 24701 --- [http-nio-9092-exec-9] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 17:24:01.389 DEBUG 24701 --- [http-nio-9092-exec-9] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 17:24:01.389 DEBUG 24701 --- [http-nio-9092-exec-9] c.m.m.L.selectList : ==> Preparing: SELECT aid_id,name,type,phone_number,email,avatar,address,website_url,is_emergency,description FROM legalAidResources LIMIT ? +2025-04-17 17:24:01.390 DEBUG 24701 --- [http-nio-9092-exec-9] c.m.m.L.selectList : ==> Parameters: 6(Integer) +2025-04-17 17:24:01.421 DEBUG 24701 --- [http-nio-9092-exec-9] c.m.m.L.selectList : <== Total: 6 +2025-04-17 17:24:02.356 DEBUG 24701 --- [http-nio-9092-exec-10] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-17 17:24:02.356 DEBUG 24701 --- [http-nio-9092-exec-10] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-17 17:24:02.388 DEBUG 24701 --- [http-nio-9092-exec-10] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-17 17:24:02.389 DEBUG 24701 --- [http-nio-9092-exec-10] c.mingchen.mapper.UserMapper.selectById : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE user_id=? +2025-04-17 17:24:02.389 DEBUG 24701 --- [http-nio-9092-exec-10] c.mingchen.mapper.UserMapper.selectById : ==> Parameters: 1(Long) +2025-04-17 17:24:02.421 DEBUG 24701 --- [http-nio-9092-exec-10] c.mingchen.mapper.UserMapper.selectById : <== Total: 1 +2025-04-17 17:25:05.182 DEBUG 24701 --- [http-nio-9092-exec-4] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-17 17:25:05.183 DEBUG 24701 --- [http-nio-9092-exec-4] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-17 17:25:05.223 DEBUG 24701 --- [http-nio-9092-exec-4] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-17 17:25:05.229 DEBUG 24701 --- [http-nio-9092-exec-4] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM learning_resources +2025-04-17 17:25:05.229 DEBUG 24701 --- [http-nio-9092-exec-4] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 17:25:05.259 DEBUG 24701 --- [http-nio-9092-exec-4] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 17:25:05.259 DEBUG 24701 --- [http-nio-9092-exec-4] c.m.m.L.selectList : ==> Preparing: SELECT resource_id,title,type,url,duration,description FROM learning_resources LIMIT ? +2025-04-17 17:25:05.259 DEBUG 24701 --- [http-nio-9092-exec-4] c.m.m.L.selectList : ==> Parameters: 2(Integer) +2025-04-17 17:25:05.288 DEBUG 24701 --- [http-nio-9092-exec-4] c.m.m.L.selectList : <== Total: 2 +2025-04-17 17:25:05.908 DEBUG 24701 --- [http-nio-9092-exec-5] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-17 17:25:05.909 DEBUG 24701 --- [http-nio-9092-exec-5] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-17 17:25:05.941 DEBUG 24701 --- [http-nio-9092-exec-5] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-17 17:25:05.945 DEBUG 24701 --- [http-nio-9092-exec-5] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM legalAidResources +2025-04-17 17:25:05.945 DEBUG 24701 --- [http-nio-9092-exec-5] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 17:25:05.978 DEBUG 24701 --- [http-nio-9092-exec-5] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 17:25:05.979 DEBUG 24701 --- [http-nio-9092-exec-5] c.m.m.L.selectList : ==> Preparing: SELECT aid_id,name,type,phone_number,email,avatar,address,website_url,is_emergency,description FROM legalAidResources LIMIT ? +2025-04-17 17:25:05.979 DEBUG 24701 --- [http-nio-9092-exec-5] c.m.m.L.selectList : ==> Parameters: 6(Integer) +2025-04-17 17:25:06.011 DEBUG 24701 --- [http-nio-9092-exec-5] c.m.m.L.selectList : <== Total: 6 +2025-04-17 17:25:06.659 DEBUG 24701 --- [http-nio-9092-exec-6] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-17 17:25:06.659 DEBUG 24701 --- [http-nio-9092-exec-6] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-17 17:25:06.689 DEBUG 24701 --- [http-nio-9092-exec-6] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-17 17:25:06.690 DEBUG 24701 --- [http-nio-9092-exec-6] c.mingchen.mapper.UserMapper.selectById : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE user_id=? +2025-04-17 17:25:06.690 DEBUG 24701 --- [http-nio-9092-exec-6] c.mingchen.mapper.UserMapper.selectById : ==> Parameters: 1(Long) +2025-04-17 17:25:06.729 DEBUG 24701 --- [http-nio-9092-exec-6] c.mingchen.mapper.UserMapper.selectById : <== Total: 1 +2025-04-17 17:25:07.918 DEBUG 24701 --- [http-nio-9092-exec-7] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-17 17:25:07.919 DEBUG 24701 --- [http-nio-9092-exec-7] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-17 17:25:07.950 DEBUG 24701 --- [http-nio-9092-exec-7] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-17 17:25:07.957 DEBUG 24701 --- [http-nio-9092-exec-7] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM legalAidResources +2025-04-17 17:25:07.958 DEBUG 24701 --- [http-nio-9092-exec-7] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 17:25:07.990 DEBUG 24701 --- [http-nio-9092-exec-7] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 17:25:07.991 DEBUG 24701 --- [http-nio-9092-exec-7] c.m.m.L.selectList : ==> Preparing: SELECT aid_id,name,type,phone_number,email,avatar,address,website_url,is_emergency,description FROM legalAidResources LIMIT ? +2025-04-17 17:25:07.991 DEBUG 24701 --- [http-nio-9092-exec-7] c.m.m.L.selectList : ==> Parameters: 6(Integer) +2025-04-17 17:25:08.029 DEBUG 24701 --- [http-nio-9092-exec-7] c.m.m.L.selectList : <== Total: 6 +2025-04-17 17:25:10.168 DEBUG 24701 --- [http-nio-9092-exec-9] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-17 17:25:10.169 DEBUG 24701 --- [http-nio-9092-exec-9] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-17 17:25:10.198 DEBUG 24701 --- [http-nio-9092-exec-9] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-17 17:25:10.203 DEBUG 24701 --- [http-nio-9092-exec-9] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM legalAidResources +2025-04-17 17:25:10.204 DEBUG 24701 --- [http-nio-9092-exec-9] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 17:25:10.249 DEBUG 24701 --- [http-nio-9092-exec-9] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 17:25:10.249 DEBUG 24701 --- [http-nio-9092-exec-9] c.m.m.L.selectList : ==> Preparing: SELECT aid_id,name,type,phone_number,email,avatar,address,website_url,is_emergency,description FROM legalAidResources LIMIT ?, ? +2025-04-17 17:25:10.250 DEBUG 24701 --- [http-nio-9092-exec-9] c.m.m.L.selectList : ==> Parameters: 6(Integer), 6(Integer) +2025-04-17 17:25:10.291 DEBUG 24701 --- [http-nio-9092-exec-9] c.m.m.L.selectList : <== Total: 6 +2025-04-17 17:25:11.908 DEBUG 24701 --- [http-nio-9092-exec-2] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-17 17:25:11.909 DEBUG 24701 --- [http-nio-9092-exec-2] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-17 17:25:11.941 DEBUG 24701 --- [http-nio-9092-exec-2] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-17 17:25:11.948 DEBUG 24701 --- [http-nio-9092-exec-2] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM legalAidResources +2025-04-17 17:25:11.949 DEBUG 24701 --- [http-nio-9092-exec-2] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 17:25:11.978 DEBUG 24701 --- [http-nio-9092-exec-2] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 17:25:11.978 DEBUG 24701 --- [http-nio-9092-exec-2] c.m.m.L.selectList : ==> Preparing: SELECT aid_id,name,type,phone_number,email,avatar,address,website_url,is_emergency,description FROM legalAidResources LIMIT ?, ? +2025-04-17 17:25:11.979 DEBUG 24701 --- [http-nio-9092-exec-2] c.m.m.L.selectList : ==> Parameters: 12(Integer), 6(Integer) +2025-04-17 17:25:12.008 DEBUG 24701 --- [http-nio-9092-exec-2] c.m.m.L.selectList : <== Total: 2 +2025-04-17 17:25:13.370 DEBUG 24701 --- [http-nio-9092-exec-1] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-17 17:25:13.371 DEBUG 24701 --- [http-nio-9092-exec-1] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-17 17:25:13.399 DEBUG 24701 --- [http-nio-9092-exec-1] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-17 17:25:13.405 DEBUG 24701 --- [http-nio-9092-exec-1] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM legalAidResources +2025-04-17 17:25:13.405 DEBUG 24701 --- [http-nio-9092-exec-1] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 17:25:13.441 DEBUG 24701 --- [http-nio-9092-exec-1] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 17:25:13.441 DEBUG 24701 --- [http-nio-9092-exec-1] c.m.m.L.selectList : ==> Preparing: SELECT aid_id,name,type,phone_number,email,avatar,address,website_url,is_emergency,description FROM legalAidResources LIMIT ? +2025-04-17 17:25:13.442 DEBUG 24701 --- [http-nio-9092-exec-1] c.m.m.L.selectList : ==> Parameters: 6(Integer) +2025-04-17 17:25:13.479 DEBUG 24701 --- [http-nio-9092-exec-1] c.m.m.L.selectList : <== Total: 6 +2025-04-17 17:25:14.558 DEBUG 24701 --- [http-nio-9092-exec-3] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-17 17:25:14.560 DEBUG 24701 --- [http-nio-9092-exec-3] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-17 17:25:14.590 DEBUG 24701 --- [http-nio-9092-exec-3] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-17 17:25:14.596 DEBUG 24701 --- [http-nio-9092-exec-3] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM learning_resources +2025-04-17 17:25:14.598 DEBUG 24701 --- [http-nio-9092-exec-3] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 17:25:14.629 DEBUG 24701 --- [http-nio-9092-exec-3] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 17:25:14.630 DEBUG 24701 --- [http-nio-9092-exec-3] c.m.m.L.selectList : ==> Preparing: SELECT resource_id,title,type,url,duration,description FROM learning_resources LIMIT ? +2025-04-17 17:25:14.630 DEBUG 24701 --- [http-nio-9092-exec-3] c.m.m.L.selectList : ==> Parameters: 2(Integer) +2025-04-17 17:25:14.668 DEBUG 24701 --- [http-nio-9092-exec-3] c.m.m.L.selectList : <== Total: 2 +2025-04-17 17:25:17.758 DEBUG 24701 --- [http-nio-9092-exec-4] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-17 17:25:17.758 DEBUG 24701 --- [http-nio-9092-exec-4] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-17 17:25:17.789 DEBUG 24701 --- [http-nio-9092-exec-4] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-17 17:25:17.795 DEBUG 24701 --- [http-nio-9092-exec-4] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM learning_resources +2025-04-17 17:25:17.795 DEBUG 24701 --- [http-nio-9092-exec-4] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 17:25:17.833 DEBUG 24701 --- [http-nio-9092-exec-4] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 17:25:17.834 DEBUG 24701 --- [http-nio-9092-exec-4] c.m.m.L.selectList : ==> Preparing: SELECT resource_id,title,type,url,duration,description FROM learning_resources LIMIT ? +2025-04-17 17:25:17.834 DEBUG 24701 --- [http-nio-9092-exec-4] c.m.m.L.selectList : ==> Parameters: 2(Integer) +2025-04-17 17:25:17.868 DEBUG 24701 --- [http-nio-9092-exec-4] c.m.m.L.selectList : <== Total: 2 +2025-04-17 17:25:18.288 DEBUG 24701 --- [http-nio-9092-exec-5] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-17 17:25:18.288 DEBUG 24701 --- [http-nio-9092-exec-5] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-17 17:25:18.322 DEBUG 24701 --- [http-nio-9092-exec-5] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-17 17:25:18.329 DEBUG 24701 --- [http-nio-9092-exec-5] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM legalAidResources +2025-04-17 17:25:18.329 DEBUG 24701 --- [http-nio-9092-exec-5] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 17:25:18.360 DEBUG 24701 --- [http-nio-9092-exec-5] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 17:25:18.361 DEBUG 24701 --- [http-nio-9092-exec-5] c.m.m.L.selectList : ==> Preparing: SELECT aid_id,name,type,phone_number,email,avatar,address,website_url,is_emergency,description FROM legalAidResources LIMIT ? +2025-04-17 17:25:18.361 DEBUG 24701 --- [http-nio-9092-exec-5] c.m.m.L.selectList : ==> Parameters: 6(Integer) +2025-04-17 17:25:18.401 DEBUG 24701 --- [http-nio-9092-exec-5] c.m.m.L.selectList : <== Total: 6 +2025-04-17 17:25:19.239 DEBUG 24701 --- [http-nio-9092-exec-6] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-17 17:25:19.240 DEBUG 24701 --- [http-nio-9092-exec-6] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-17 17:25:19.292 DEBUG 24701 --- [http-nio-9092-exec-6] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-17 17:25:19.295 DEBUG 24701 --- [http-nio-9092-exec-6] c.mingchen.mapper.UserMapper.selectById : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE user_id=? +2025-04-17 17:25:19.296 DEBUG 24701 --- [http-nio-9092-exec-6] c.mingchen.mapper.UserMapper.selectById : ==> Parameters: 1(Long) +2025-04-17 17:25:19.334 DEBUG 24701 --- [http-nio-9092-exec-6] c.mingchen.mapper.UserMapper.selectById : <== Total: 1 +2025-04-17 17:38:29.064 INFO 24701 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED paused. +2025-04-17 17:38:29.069 INFO 24701 --- [SpringContextShutdownHook] o.s.s.quartz.SchedulerFactoryBean : Shutting down Quartz Scheduler +2025-04-17 17:38:29.069 INFO 24701 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED shutting down. +2025-04-17 17:38:29.069 INFO 24701 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED paused. +2025-04-17 17:38:29.069 INFO 24701 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED shutdown complete. +2025-04-17 17:38:29.071 INFO 24701 --- [SpringContextShutdownHook] o.s.s.concurrent.ThreadPoolTaskExecutor : Shutting down ExecutorService 'applicationTaskExecutor' +2025-04-17 17:38:29.096 INFO 24701 --- [SpringContextShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown initiated... +2025-04-17 17:38:29.098 INFO 24701 --- [SpringContextShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown completed. +2025-04-17 17:39:17.478 INFO 865 --- [restartedMain] com.mingchen.BlogApiApplication : Starting BlogApiApplication on mingchendeMac-mini.local with PID 865 (/Users/mingchen/code/java/other/legalAid/api/target/classes started by mingchen in /Users/mingchen/code/java/other/legalAid) +2025-04-17 17:39:17.480 DEBUG 865 --- [restartedMain] com.mingchen.BlogApiApplication : Running with Spring Boot v2.2.7.RELEASE, Spring v5.2.6.RELEASE +2025-04-17 17:39:17.480 INFO 865 --- [restartedMain] com.mingchen.BlogApiApplication : The following profiles are active: dev +2025-04-17 17:39:17.505 INFO 865 --- [restartedMain] o.s.b.devtools.restart.ChangeableUrls : The Class-Path manifest attribute in /usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/jaxb-runtime-2.3.1.jar referenced one or more files that do not exist: file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/jaxb-api-2.3.1.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/txw2-2.3.1.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/istack-commons-runtime-3.0.7.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/stax-ex-1.8.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/FastInfoset-1.2.15.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/javax.activation-api-1.2.0.jar +2025-04-17 17:39:17.505 INFO 865 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : Devtools property defaults active! Set 'spring.devtools.add-properties' to 'false' to disable +2025-04-17 17:39:17.509 INFO 865 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : For additional web related logging consider setting the 'logging.level.web' property to 'DEBUG' +2025-04-17 17:39:17.763 INFO 865 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Multiple Spring Data modules found, entering strict repository configuration mode! +2025-04-17 17:39:17.764 INFO 865 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data Redis repositories in DEFAULT mode. +2025-04-17 17:39:17.776 INFO 865 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 7ms. Found 0 Redis repository interfaces. +2025-04-17 17:39:18.048 INFO 865 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 9092 (http) +2025-04-17 17:39:18.051 INFO 865 --- [restartedMain] o.apache.catalina.core.StandardService : Starting service [Tomcat] +2025-04-17 17:39:18.052 INFO 865 --- [restartedMain] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.34] +2025-04-17 17:39:18.077 INFO 865 --- [restartedMain] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext +2025-04-17 17:39:18.077 INFO 865 --- [restartedMain] o.s.web.context.ContextLoader : Root WebApplicationContext: initialization completed in 568 ms +2025-04-17 17:39:18.642 INFO 865 --- [restartedMain] n.b.p.u.AbstractUserAgentAnalyzerDirect : - Loaded 90 files in 240 msec using expression: classpath*:UserAgents/**/*.yaml +2025-04-17 17:39:18.642 INFO 865 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : +2025-04-17 17:39:18.642 INFO 865 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : /-----------------------------------------------------------\ +2025-04-17 17:39:18.642 INFO 865 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : | Yauaa 5.20 (v5.20 @ 2020-11-22T15:39:16Z) | +2025-04-17 17:39:18.642 INFO 865 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : +-----------------------------------------------------------+ +2025-04-17 17:39:18.642 INFO 865 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : | For more information: https://yauaa.basjes.nl | +2025-04-17 17:39:18.642 INFO 865 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : | Copyright (C) 2013-2020 Niels Basjes - License Apache 2.0 | +2025-04-17 17:39:18.642 INFO 865 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : \-----------------------------------------------------------/ +2025-04-17 17:39:18.643 INFO 865 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : +2025-04-17 17:39:18.647 INFO 865 --- [restartedMain] n.b.p.u.AbstractUserAgentAnalyzerDirect : Building all needed matchers for the requested 11 fields. +2025-04-17 17:39:18.709 INFO 865 --- [restartedMain] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor' +2025-04-17 17:39:18.793 INFO 865 --- [restartedMain] org.quartz.impl.StdSchedulerFactory : Using default implementation for ThreadExecutor +2025-04-17 17:39:18.796 INFO 865 --- [restartedMain] org.quartz.core.SchedulerSignalerImpl : Initialized Scheduler Signaller of type: class org.quartz.core.SchedulerSignalerImpl +2025-04-17 17:39:18.796 INFO 865 --- [restartedMain] org.quartz.core.QuartzScheduler : Quartz Scheduler v.2.3.2 created. +2025-04-17 17:39:18.797 INFO 865 --- [restartedMain] org.quartz.simpl.RAMJobStore : RAMJobStore initialized. +2025-04-17 17:39:18.797 INFO 865 --- [restartedMain] org.quartz.core.QuartzScheduler : Scheduler meta-data: Quartz Scheduler (v2.3.2) 'quartzScheduler' with instanceId 'NON_CLUSTERED' + Scheduler class: 'org.quartz.core.QuartzScheduler' - running locally. + NOT STARTED. + Currently in standby mode. + Number of jobs executed: 0 + Using thread pool 'org.quartz.simpl.SimpleThreadPool' - with 10 threads. + Using job-store 'org.quartz.simpl.RAMJobStore' - which does not support persistence. and is not clustered. + +2025-04-17 17:39:18.797 INFO 865 --- [restartedMain] org.quartz.impl.StdSchedulerFactory : Quartz scheduler 'quartzScheduler' initialized from an externally provided properties instance. +2025-04-17 17:39:18.797 INFO 865 --- [restartedMain] org.quartz.impl.StdSchedulerFactory : Quartz scheduler version: 2.3.2 +2025-04-17 17:39:18.797 INFO 865 --- [restartedMain] org.quartz.core.QuartzScheduler : JobFactory set to: org.springframework.scheduling.quartz.SpringBeanJobFactory@3e1f1e9d +2025-04-17 17:39:18.828 INFO 865 --- [restartedMain] o.s.s.web.DefaultSecurityFilterChain : Creating filter chain: any request, [org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter@2da9bf97, org.springframework.security.web.context.SecurityContextPersistenceFilter@6ffc8b83, org.springframework.security.web.header.HeaderWriterFilter@3d77082, org.springframework.web.filter.CorsFilter@4726a69b, org.springframework.security.web.authentication.logout.LogoutFilter@2b0c642e, com.mingchen.common.config.JwtLoginFilter@3340086a, com.mingchen.common.config.JwtFilter@5c6ae6b0, org.springframework.security.web.savedrequest.RequestCacheAwareFilter@82db5cd, org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter@5f3b871b, org.springframework.security.web.authentication.AnonymousAuthenticationFilter@3c5fafad, org.springframework.security.web.session.SessionManagementFilter@55a2bb95, org.springframework.security.web.access.ExceptionTranslationFilter@287e96a7, org.springframework.security.web.access.intercept.FilterSecurityInterceptor@5b6b8030] +2025-04-17 17:39:18.839 INFO 865 --- [restartedMain] o.s.b.d.a.OptionalLiveReloadServer : LiveReload server is running on port 35729 +2025-04-17 17:39:18.849 INFO 865 --- [restartedMain] o.s.s.quartz.SchedulerFactoryBean : Starting Quartz Scheduler now +2025-04-17 17:39:18.849 INFO 865 --- [restartedMain] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED started. +2025-04-17 17:39:18.861 INFO 865 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 9092 (http) with context path '' +2025-04-17 17:39:18.864 INFO 865 --- [restartedMain] com.mingchen.BlogApiApplication : Started BlogApiApplication in 1.576 seconds (JVM running for 2.311) +2025-04-17 17:39:23.775 INFO 865 --- [http-nio-9092-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet' +2025-04-17 17:39:23.775 INFO 865 --- [http-nio-9092-exec-1] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet' +2025-04-17 17:39:23.777 INFO 865 --- [http-nio-9092-exec-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 2 ms +2025-04-17 17:39:23.788 DEBUG 865 --- [http-nio-9092-exec-3] c.mingchen.common.config.JwtLoginFilter : Request is to process authentication +2025-04-17 17:39:23.828 INFO 865 --- [http-nio-9092-exec-3] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting... +2025-04-17 17:39:24.866 ERROR 865 --- [http-nio-9092-exec-3] com.zaxxer.hikari.pool.HikariPool : HikariPool-1 - Exception during pool initialization. + +com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure + +The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server. + at com.mysql.cj.jdbc.exceptions.SQLError.createCommunicationsException(SQLError.java:174) + at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:64) + at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:836) + at com.mysql.cj.jdbc.ConnectionImpl.(ConnectionImpl.java:456) + at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:246) + at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:197) + at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:138) + at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:358) + at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:206) + at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:477) + at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:560) + at com.zaxxer.hikari.pool.HikariPool.(HikariPool.java:115) + at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:112) + at org.springframework.jdbc.datasource.DataSourceUtils.fetchConnection(DataSourceUtils.java:158) + at org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSourceUtils.java:116) + at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:79) + at org.mybatis.spring.transaction.SpringManagedTransaction.openConnection(SpringManagedTransaction.java:80) + at org.mybatis.spring.transaction.SpringManagedTransaction.getConnection(SpringManagedTransaction.java:67) + at org.apache.ibatis.executor.BaseExecutor.getConnection(BaseExecutor.java:348) + at org.apache.ibatis.executor.SimpleExecutor.prepareStatement(SimpleExecutor.java:89) + at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:64) + at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:336) + at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:158) + at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:110) + at com.github.pagehelper.PageInterceptor.intercept(PageInterceptor.java:108) + at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:59) + at jdk.proxy2/jdk.proxy2.$Proxy111.query(Unknown Source) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:154) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:147) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:142) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:569) + at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:427) + at jdk.proxy2/jdk.proxy2.$Proxy83.selectList(Unknown Source) + at org.mybatis.spring.SqlSessionTemplate.selectList(SqlSessionTemplate.java:224) + at com.baomidou.mybatisplus.core.override.MybatisMapperMethod.executeForMany(MybatisMapperMethod.java:164) + at com.baomidou.mybatisplus.core.override.MybatisMapperMethod.execute(MybatisMapperMethod.java:77) + at com.baomidou.mybatisplus.core.override.MybatisMapperProxy$PlainMethodInvoker.invoke(MybatisMapperProxy.java:152) + at com.baomidou.mybatisplus.core.override.MybatisMapperProxy.invoke(MybatisMapperProxy.java:89) + at jdk.proxy3/jdk.proxy3.$Proxy89.selectList(Unknown Source) + at com.baomidou.mybatisplus.core.mapper.BaseMapper.selectOne(BaseMapper.java:222) + at java.base/java.lang.invoke.MethodHandle.invokeWithArguments(MethodHandle.java:732) + at com.baomidou.mybatisplus.core.override.MybatisMapperProxy$DefaultMethodInvoker.invoke(MybatisMapperProxy.java:166) + at com.baomidou.mybatisplus.core.override.MybatisMapperProxy.invoke(MybatisMapperProxy.java:89) + at jdk.proxy3/jdk.proxy3.$Proxy89.selectOne(Unknown Source) + at com.baomidou.mybatisplus.core.mapper.BaseMapper.selectOne(BaseMapper.java:211) + at java.base/java.lang.invoke.MethodHandle.invokeWithArguments(MethodHandle.java:732) + at com.baomidou.mybatisplus.core.override.MybatisMapperProxy$DefaultMethodInvoker.invoke(MybatisMapperProxy.java:166) + at com.baomidou.mybatisplus.core.override.MybatisMapperProxy.invoke(MybatisMapperProxy.java:89) + at jdk.proxy3/jdk.proxy3.$Proxy89.selectOne(Unknown Source) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:569) + at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:344) + at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:198) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) + at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:139) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) + at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:212) + at jdk.proxy3/jdk.proxy3.$Proxy90.selectOne(Unknown Source) + at com.mingchen.service.impl.UserServiceImpl.loadUserByUsername(UserServiceImpl.java:39) + at com.mingchen.service.impl.UserServiceImpl$$FastClassBySpringCGLIB$$da3f6913.invoke() + at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) + at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:687) + at com.mingchen.service.impl.UserServiceImpl$$EnhancerBySpringCGLIB$$6a4d1119.loadUserByUsername() + at com.mingchen.common.config.CustomAuthenticationProvider.authenticate(CustomAuthenticationProvider.java:34) + at org.springframework.security.authentication.ProviderManager.authenticate(ProviderManager.java:175) + at com.mingchen.common.config.JwtLoginFilter.attemptAuthentication(JwtLoginFilter.java:49) + at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:212) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:116) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:92) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:92) + at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:77) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:105) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:56) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:215) + at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:178) + at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:358) + at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:271) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202) + at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) + at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541) + at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139) + at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) + at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) + at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) + at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:373) + at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) + at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868) + at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1590) + at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) + at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) + at java.base/java.lang.Thread.run(Thread.java:840) +Caused by: com.mysql.cj.exceptions.CJCommunicationsException: Communications link failure + +The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server. + at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) + at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) + at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:500) + at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:481) + at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:61) + at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:105) + at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:151) + at com.mysql.cj.exceptions.ExceptionFactory.createCommunicationsException(ExceptionFactory.java:167) + at com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:91) + at com.mysql.cj.NativeSession.connect(NativeSession.java:144) + at com.mysql.cj.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:956) + at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:826) + ... 118 common frames omitted +Caused by: java.net.SocketException: Network is unreachable + at java.base/sun.nio.ch.Net.connect0(Native Method) + at java.base/sun.nio.ch.Net.connect(Net.java:579) + at java.base/sun.nio.ch.Net.connect(Net.java:568) + at java.base/sun.nio.ch.NioSocketImpl.connect(NioSocketImpl.java:593) + at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:327) + at java.base/java.net.Socket.connect(Socket.java:633) + at com.mysql.cj.protocol.StandardSocketFactory.connect(StandardSocketFactory.java:155) + at com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:65) + ... 121 common frames omitted + +2025-04-17 17:39:24.875 ERROR 865 --- [http-nio-9092-exec-3] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception + +org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exceptions.PersistenceException: +### Error querying database. Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection; nested exception is com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure + +The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server. +### The error may exist in com/mingchen/mapper/UserMapper.java (best guess) +### The error may involve com.mingchen.mapper.UserMapper.selectList +### The error occurred while executing a query +### Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection; nested exception is com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure + +The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server. + at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:96) + at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:441) + at jdk.proxy2/jdk.proxy2.$Proxy83.selectList(Unknown Source) + at org.mybatis.spring.SqlSessionTemplate.selectList(SqlSessionTemplate.java:224) + at com.baomidou.mybatisplus.core.override.MybatisMapperMethod.executeForMany(MybatisMapperMethod.java:164) + at com.baomidou.mybatisplus.core.override.MybatisMapperMethod.execute(MybatisMapperMethod.java:77) + at com.baomidou.mybatisplus.core.override.MybatisMapperProxy$PlainMethodInvoker.invoke(MybatisMapperProxy.java:152) + at com.baomidou.mybatisplus.core.override.MybatisMapperProxy.invoke(MybatisMapperProxy.java:89) + at jdk.proxy3/jdk.proxy3.$Proxy89.selectList(Unknown Source) + at com.baomidou.mybatisplus.core.mapper.BaseMapper.selectOne(BaseMapper.java:222) + at java.base/java.lang.invoke.MethodHandle.invokeWithArguments(MethodHandle.java:732) + at com.baomidou.mybatisplus.core.override.MybatisMapperProxy$DefaultMethodInvoker.invoke(MybatisMapperProxy.java:166) + at com.baomidou.mybatisplus.core.override.MybatisMapperProxy.invoke(MybatisMapperProxy.java:89) + at jdk.proxy3/jdk.proxy3.$Proxy89.selectOne(Unknown Source) + at com.baomidou.mybatisplus.core.mapper.BaseMapper.selectOne(BaseMapper.java:211) + at java.base/java.lang.invoke.MethodHandle.invokeWithArguments(MethodHandle.java:732) + at com.baomidou.mybatisplus.core.override.MybatisMapperProxy$DefaultMethodInvoker.invoke(MybatisMapperProxy.java:166) + at com.baomidou.mybatisplus.core.override.MybatisMapperProxy.invoke(MybatisMapperProxy.java:89) + at jdk.proxy3/jdk.proxy3.$Proxy89.selectOne(Unknown Source) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:569) + at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:344) + at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:198) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) + at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:139) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) + at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:212) + at jdk.proxy3/jdk.proxy3.$Proxy90.selectOne(Unknown Source) + at com.mingchen.service.impl.UserServiceImpl.loadUserByUsername(UserServiceImpl.java:39) + at com.mingchen.service.impl.UserServiceImpl$$FastClassBySpringCGLIB$$da3f6913.invoke() + at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) + at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:687) + at com.mingchen.service.impl.UserServiceImpl$$EnhancerBySpringCGLIB$$6a4d1119.loadUserByUsername() + at com.mingchen.common.config.CustomAuthenticationProvider.authenticate(CustomAuthenticationProvider.java:34) + at org.springframework.security.authentication.ProviderManager.authenticate(ProviderManager.java:175) + at com.mingchen.common.config.JwtLoginFilter.attemptAuthentication(JwtLoginFilter.java:49) + at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:212) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:116) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:92) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:92) + at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:77) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:105) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:56) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:215) + at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:178) + at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:358) + at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:271) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202) + at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) + at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541) + at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139) + at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) + at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) + at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) + at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:373) + at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) + at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868) + at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1590) + at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) + at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) + at java.base/java.lang.Thread.run(Thread.java:840) +Caused by: org.apache.ibatis.exceptions.PersistenceException: +### Error querying database. Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection; nested exception is com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure + +The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server. +### The error may exist in com/mingchen/mapper/UserMapper.java (best guess) +### The error may involve com.mingchen.mapper.UserMapper.selectList +### The error occurred while executing a query +### Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection; nested exception is com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure + +The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server. + at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:30) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:156) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:147) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:142) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:569) + at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:427) + ... 86 common frames omitted +Caused by: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection; nested exception is com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure + +The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server. + at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:82) + at org.mybatis.spring.transaction.SpringManagedTransaction.openConnection(SpringManagedTransaction.java:80) + at org.mybatis.spring.transaction.SpringManagedTransaction.getConnection(SpringManagedTransaction.java:67) + at org.apache.ibatis.executor.BaseExecutor.getConnection(BaseExecutor.java:348) + at org.apache.ibatis.executor.SimpleExecutor.prepareStatement(SimpleExecutor.java:89) + at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:64) + at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:336) + at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:158) + at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:110) + at com.github.pagehelper.PageInterceptor.intercept(PageInterceptor.java:108) + at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:59) + at jdk.proxy2/jdk.proxy2.$Proxy111.query(Unknown Source) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:154) + ... 93 common frames omitted +Caused by: com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure + +The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server. + at com.mysql.cj.jdbc.exceptions.SQLError.createCommunicationsException(SQLError.java:174) + at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:64) + at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:836) + at com.mysql.cj.jdbc.ConnectionImpl.(ConnectionImpl.java:456) + at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:246) + at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:197) + at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:138) + at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:358) + at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:206) + at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:477) + at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:560) + at com.zaxxer.hikari.pool.HikariPool.(HikariPool.java:115) + at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:112) + at org.springframework.jdbc.datasource.DataSourceUtils.fetchConnection(DataSourceUtils.java:158) + at org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSourceUtils.java:116) + at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:79) + ... 105 common frames omitted +Caused by: com.mysql.cj.exceptions.CJCommunicationsException: Communications link failure + +The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server. + at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) + at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) + at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:500) + at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:481) + at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:61) + at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:105) + at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:151) + at com.mysql.cj.exceptions.ExceptionFactory.createCommunicationsException(ExceptionFactory.java:167) + at com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:91) + at com.mysql.cj.NativeSession.connect(NativeSession.java:144) + at com.mysql.cj.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:956) + at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:826) + ... 118 common frames omitted +Caused by: java.net.SocketException: Network is unreachable + at java.base/sun.nio.ch.Net.connect0(Native Method) + at java.base/sun.nio.ch.Net.connect(Net.java:579) + at java.base/sun.nio.ch.Net.connect(Net.java:568) + at java.base/sun.nio.ch.NioSocketImpl.connect(NioSocketImpl.java:593) + at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:327) + at java.base/java.net.Socket.connect(Socket.java:633) + at com.mysql.cj.protocol.StandardSocketFactory.connect(StandardSocketFactory.java:155) + at com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:65) + ... 121 common frames omitted + +2025-04-17 17:39:24.930 INFO 865 --- [http-nio-9092-exec-3] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting... +2025-04-17 17:39:25.937 ERROR 865 --- [http-nio-9092-exec-3] com.zaxxer.hikari.pool.HikariPool : HikariPool-1 - Exception during pool initialization. + +com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure + +The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server. + at com.mysql.cj.jdbc.exceptions.SQLError.createCommunicationsException(SQLError.java:174) + at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:64) + at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:836) + at com.mysql.cj.jdbc.ConnectionImpl.(ConnectionImpl.java:456) + at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:246) + at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:197) + at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:138) + at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:358) + at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:206) + at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:477) + at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:560) + at com.zaxxer.hikari.pool.HikariPool.(HikariPool.java:115) + at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:112) + at org.springframework.jdbc.datasource.DataSourceUtils.fetchConnection(DataSourceUtils.java:158) + at org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSourceUtils.java:116) + at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:79) + at org.mybatis.spring.transaction.SpringManagedTransaction.openConnection(SpringManagedTransaction.java:80) + at org.mybatis.spring.transaction.SpringManagedTransaction.getConnection(SpringManagedTransaction.java:67) + at org.apache.ibatis.executor.BaseExecutor.getConnection(BaseExecutor.java:348) + at org.apache.ibatis.executor.SimpleExecutor.prepareStatement(SimpleExecutor.java:89) + at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:64) + at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:336) + at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:158) + at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:110) + at com.github.pagehelper.PageInterceptor.intercept(PageInterceptor.java:108) + at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:59) + at jdk.proxy2/jdk.proxy2.$Proxy111.query(Unknown Source) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:154) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:147) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:142) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:569) + at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:427) + at jdk.proxy2/jdk.proxy2.$Proxy83.selectList(Unknown Source) + at org.mybatis.spring.SqlSessionTemplate.selectList(SqlSessionTemplate.java:224) + at com.baomidou.mybatisplus.core.override.MybatisMapperMethod.executeForMany(MybatisMapperMethod.java:164) + at com.baomidou.mybatisplus.core.override.MybatisMapperMethod.execute(MybatisMapperMethod.java:77) + at com.baomidou.mybatisplus.core.override.MybatisMapperProxy$PlainMethodInvoker.invoke(MybatisMapperProxy.java:152) + at com.baomidou.mybatisplus.core.override.MybatisMapperProxy.invoke(MybatisMapperProxy.java:89) + at jdk.proxy3/jdk.proxy3.$Proxy89.selectList(Unknown Source) + at com.baomidou.mybatisplus.core.mapper.BaseMapper.selectOne(BaseMapper.java:222) + at java.base/java.lang.invoke.MethodHandle.invokeWithArguments(MethodHandle.java:732) + at com.baomidou.mybatisplus.core.override.MybatisMapperProxy$DefaultMethodInvoker.invoke(MybatisMapperProxy.java:166) + at com.baomidou.mybatisplus.core.override.MybatisMapperProxy.invoke(MybatisMapperProxy.java:89) + at jdk.proxy3/jdk.proxy3.$Proxy89.selectOne(Unknown Source) + at com.baomidou.mybatisplus.core.mapper.BaseMapper.selectOne(BaseMapper.java:211) + at java.base/java.lang.invoke.MethodHandle.invokeWithArguments(MethodHandle.java:732) + at com.baomidou.mybatisplus.core.override.MybatisMapperProxy$DefaultMethodInvoker.invoke(MybatisMapperProxy.java:166) + at com.baomidou.mybatisplus.core.override.MybatisMapperProxy.invoke(MybatisMapperProxy.java:89) + at jdk.proxy3/jdk.proxy3.$Proxy89.selectOne(Unknown Source) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:569) + at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:344) + at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:198) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) + at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:139) + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) + at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:212) + at jdk.proxy3/jdk.proxy3.$Proxy90.selectOne(Unknown Source) + at com.mingchen.service.impl.UserServiceImpl.loadUserByUsername(UserServiceImpl.java:39) + at com.mingchen.service.impl.UserServiceImpl$$FastClassBySpringCGLIB$$da3f6913.invoke() + at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) + at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:687) + at com.mingchen.service.impl.UserServiceImpl$$EnhancerBySpringCGLIB$$6a4d1119.loadUserByUsername() + at com.mingchen.common.interceptor.UserContextInterceptor.preHandle(UserContextInterceptor.java:34) + at org.springframework.web.servlet.HandlerExecutionChain.applyPreHandle(HandlerExecutionChain.java:141) + at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1035) + at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943) + at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) + at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909) + at javax.servlet.http.HttpServlet.service(HttpServlet.java:523) + at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) + at javax.servlet.http.HttpServlet.service(HttpServlet.java:590) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:320) + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:126) + at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:90) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:118) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:137) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:111) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:158) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at com.mingchen.common.config.JwtFilter.doFilter(JwtFilter.java:68) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:200) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:116) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:103) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:103) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:105) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:103) + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) + at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:215) + at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:178) + at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:358) + at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:271) + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) + at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:712) + at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:461) + at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:384) + at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:312) + at org.apache.catalina.core.StandardHostValve.custom(StandardHostValve.java:394) + at org.apache.catalina.core.StandardHostValve.status(StandardHostValve.java:253) + at org.apache.catalina.core.StandardHostValve.throwable(StandardHostValve.java:348) + at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:173) + at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) + at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) + at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) + at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:373) + at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) + at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868) + at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1590) + at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) + at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) + at java.base/java.lang.Thread.run(Thread.java:840) +Caused by: com.mysql.cj.exceptions.CJCommunicationsException: Communications link failure + +The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server. + at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) + at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) + at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:500) + at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:481) + at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:61) + at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:105) + at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:151) + at com.mysql.cj.exceptions.ExceptionFactory.createCommunicationsException(ExceptionFactory.java:167) + at com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:91) + at com.mysql.cj.NativeSession.connect(NativeSession.java:144) + at com.mysql.cj.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:956) + at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:826) + ... 130 common frames omitted +Caused by: java.net.SocketException: Network is unreachable + at java.base/sun.nio.ch.Net.connect0(Native Method) + at java.base/sun.nio.ch.Net.connect(Net.java:579) + at java.base/sun.nio.ch.Net.connect(Net.java:568) + at java.base/sun.nio.ch.NioSocketImpl.connect(NioSocketImpl.java:593) + at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:327) + at java.base/java.net.Socket.connect(Socket.java:633) + at com.mysql.cj.protocol.StandardSocketFactory.connect(StandardSocketFactory.java:155) + at com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:65) + ... 133 common frames omitted + +2025-04-17 17:39:29.876 INFO 865 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED paused. +2025-04-17 17:39:29.878 INFO 865 --- [SpringContextShutdownHook] o.s.s.quartz.SchedulerFactoryBean : Shutting down Quartz Scheduler +2025-04-17 17:39:29.878 INFO 865 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED shutting down. +2025-04-17 17:39:29.878 INFO 865 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED paused. +2025-04-17 17:39:29.878 INFO 865 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED shutdown complete. +2025-04-17 17:39:29.878 INFO 865 --- [SpringContextShutdownHook] o.s.s.concurrent.ThreadPoolTaskExecutor : Shutting down ExecutorService 'applicationTaskExecutor' +2025-04-17 17:39:32.105 INFO 894 --- [restartedMain] com.mingchen.BlogApiApplication : Starting BlogApiApplication on mingchendeMac-mini.local with PID 894 (/Users/mingchen/code/java/other/legalAid/api/target/classes started by mingchen in /Users/mingchen/code/java/other/legalAid) +2025-04-17 17:39:32.106 DEBUG 894 --- [restartedMain] com.mingchen.BlogApiApplication : Running with Spring Boot v2.2.7.RELEASE, Spring v5.2.6.RELEASE +2025-04-17 17:39:32.106 INFO 894 --- [restartedMain] com.mingchen.BlogApiApplication : The following profiles are active: dev +2025-04-17 17:39:32.122 INFO 894 --- [restartedMain] o.s.b.devtools.restart.ChangeableUrls : The Class-Path manifest attribute in /usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/jaxb-runtime-2.3.1.jar referenced one or more files that do not exist: file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/jaxb-api-2.3.1.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/txw2-2.3.1.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/istack-commons-runtime-3.0.7.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/stax-ex-1.8.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/FastInfoset-1.2.15.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/javax.activation-api-1.2.0.jar +2025-04-17 17:39:32.122 INFO 894 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : Devtools property defaults active! Set 'spring.devtools.add-properties' to 'false' to disable +2025-04-17 17:39:32.122 INFO 894 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : For additional web related logging consider setting the 'logging.level.web' property to 'DEBUG' +2025-04-17 17:39:32.310 INFO 894 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Multiple Spring Data modules found, entering strict repository configuration mode! +2025-04-17 17:39:32.311 INFO 894 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data Redis repositories in DEFAULT mode. +2025-04-17 17:39:32.324 INFO 894 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 8ms. Found 0 Redis repository interfaces. +2025-04-17 17:39:32.722 INFO 894 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 9092 (http) +2025-04-17 17:39:32.725 INFO 894 --- [restartedMain] o.apache.catalina.core.StandardService : Starting service [Tomcat] +2025-04-17 17:39:32.725 INFO 894 --- [restartedMain] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.34] +2025-04-17 17:39:32.752 INFO 894 --- [restartedMain] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext +2025-04-17 17:39:32.752 INFO 894 --- [restartedMain] o.s.web.context.ContextLoader : Root WebApplicationContext: initialization completed in 630 ms +2025-04-17 17:39:33.392 INFO 894 --- [restartedMain] n.b.p.u.AbstractUserAgentAnalyzerDirect : - Loaded 90 files in 239 msec using expression: classpath*:UserAgents/**/*.yaml +2025-04-17 17:39:33.393 INFO 894 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : +2025-04-17 17:39:33.393 INFO 894 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : /-----------------------------------------------------------\ +2025-04-17 17:39:33.393 INFO 894 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : | Yauaa 5.20 (v5.20 @ 2020-11-22T15:39:16Z) | +2025-04-17 17:39:33.393 INFO 894 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : +-----------------------------------------------------------+ +2025-04-17 17:39:33.393 INFO 894 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : | For more information: https://yauaa.basjes.nl | +2025-04-17 17:39:33.393 INFO 894 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : | Copyright (C) 2013-2020 Niels Basjes - License Apache 2.0 | +2025-04-17 17:39:33.393 INFO 894 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : \-----------------------------------------------------------/ +2025-04-17 17:39:33.393 INFO 894 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : +2025-04-17 17:39:33.396 INFO 894 --- [restartedMain] n.b.p.u.AbstractUserAgentAnalyzerDirect : Building all needed matchers for the requested 11 fields. +2025-04-17 17:39:33.459 INFO 894 --- [restartedMain] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor' +2025-04-17 17:39:33.551 INFO 894 --- [restartedMain] org.quartz.impl.StdSchedulerFactory : Using default implementation for ThreadExecutor +2025-04-17 17:39:33.555 INFO 894 --- [restartedMain] org.quartz.core.SchedulerSignalerImpl : Initialized Scheduler Signaller of type: class org.quartz.core.SchedulerSignalerImpl +2025-04-17 17:39:33.555 INFO 894 --- [restartedMain] org.quartz.core.QuartzScheduler : Quartz Scheduler v.2.3.2 created. +2025-04-17 17:39:33.555 INFO 894 --- [restartedMain] org.quartz.simpl.RAMJobStore : RAMJobStore initialized. +2025-04-17 17:39:33.555 INFO 894 --- [restartedMain] org.quartz.core.QuartzScheduler : Scheduler meta-data: Quartz Scheduler (v2.3.2) 'quartzScheduler' with instanceId 'NON_CLUSTERED' + Scheduler class: 'org.quartz.core.QuartzScheduler' - running locally. + NOT STARTED. + Currently in standby mode. + Number of jobs executed: 0 + Using thread pool 'org.quartz.simpl.SimpleThreadPool' - with 10 threads. + Using job-store 'org.quartz.simpl.RAMJobStore' - which does not support persistence. and is not clustered. + +2025-04-17 17:39:33.555 INFO 894 --- [restartedMain] org.quartz.impl.StdSchedulerFactory : Quartz scheduler 'quartzScheduler' initialized from an externally provided properties instance. +2025-04-17 17:39:33.555 INFO 894 --- [restartedMain] org.quartz.impl.StdSchedulerFactory : Quartz scheduler version: 2.3.2 +2025-04-17 17:39:33.555 INFO 894 --- [restartedMain] org.quartz.core.QuartzScheduler : JobFactory set to: org.springframework.scheduling.quartz.SpringBeanJobFactory@6a6eeec7 +2025-04-17 17:39:33.591 INFO 894 --- [restartedMain] o.s.s.web.DefaultSecurityFilterChain : Creating filter chain: any request, [org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter@4b4a7a3c, org.springframework.security.web.context.SecurityContextPersistenceFilter@1c5f76c7, org.springframework.security.web.header.HeaderWriterFilter@18360e62, org.springframework.web.filter.CorsFilter@1c3c7ab8, org.springframework.security.web.authentication.logout.LogoutFilter@763175bc, com.mingchen.common.config.JwtLoginFilter@1fb7a27a, com.mingchen.common.config.JwtFilter@37cd51fc, org.springframework.security.web.savedrequest.RequestCacheAwareFilter@6f25ca8f, org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter@4195d190, org.springframework.security.web.authentication.AnonymousAuthenticationFilter@2f4e56a3, org.springframework.security.web.session.SessionManagementFilter@57972c67, org.springframework.security.web.access.ExceptionTranslationFilter@15b7644b, org.springframework.security.web.access.intercept.FilterSecurityInterceptor@7d82cc6c] +2025-04-17 17:39:33.612 INFO 894 --- [restartedMain] o.s.b.d.a.OptionalLiveReloadServer : LiveReload server is running on port 35729 +2025-04-17 17:39:33.624 INFO 894 --- [restartedMain] o.s.s.quartz.SchedulerFactoryBean : Starting Quartz Scheduler now +2025-04-17 17:39:33.624 INFO 894 --- [restartedMain] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED started. +2025-04-17 17:39:33.635 INFO 894 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 9092 (http) with context path '' +2025-04-17 17:39:33.638 INFO 894 --- [restartedMain] com.mingchen.BlogApiApplication : Started BlogApiApplication in 1.691 seconds (JVM running for 1.996) +2025-04-17 17:39:39.529 INFO 894 --- [http-nio-9092-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet' +2025-04-17 17:39:39.529 INFO 894 --- [http-nio-9092-exec-1] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet' +2025-04-17 17:39:39.532 INFO 894 --- [http-nio-9092-exec-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 3 ms +2025-04-17 17:39:39.544 DEBUG 894 --- [http-nio-9092-exec-1] c.mingchen.common.config.JwtLoginFilter : Request is to process authentication +2025-04-17 17:39:39.585 INFO 894 --- [http-nio-9092-exec-1] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting... +2025-04-17 17:39:41.300 INFO 894 --- [http-nio-9092-exec-1] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed. +2025-04-17 17:39:41.312 DEBUG 894 --- [http-nio-9092-exec-1] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-17 17:39:41.333 DEBUG 894 --- [http-nio-9092-exec-1] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-17 17:39:41.528 DEBUG 894 --- [http-nio-9092-exec-1] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-17 17:39:41.808 DEBUG 894 --- [http-nio-9092-exec-2] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-17 17:39:41.808 DEBUG 894 --- [http-nio-9092-exec-2] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-17 17:39:42.562 DEBUG 894 --- [http-nio-9092-exec-2] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-17 17:39:42.584 DEBUG 894 --- [http-nio-9092-exec-2] c.m.m.C.getAllCategoriesWithLaws : ==> Preparing: SELECT c.category_id, c.name, c.description, l.law_id, l.category_id AS law_category_id, l.title, l.summary, l.content, l.effective_date, l.reference_url FROM categories c LEFT JOIN laws l ON c.category_id = l.category_id ORDER BY c.category_id, l.law_id +2025-04-17 17:39:42.585 DEBUG 894 --- [http-nio-9092-exec-2] c.m.m.C.getAllCategoriesWithLaws : ==> Parameters: +2025-04-17 17:39:44.206 DEBUG 894 --- [http-nio-9092-exec-2] c.m.m.C.getAllCategoriesWithLaws : <== Total: 6 +2025-04-17 17:39:52.641 DEBUG 894 --- [http-nio-9092-exec-5] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-17 17:39:52.642 DEBUG 894 --- [http-nio-9092-exec-5] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-17 17:39:53.114 DEBUG 894 --- [http-nio-9092-exec-7] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-17 17:39:53.115 DEBUG 894 --- [http-nio-9092-exec-7] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-17 17:39:53.115 DEBUG 894 --- [http-nio-9092-exec-5] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-17 17:39:53.166 DEBUG 894 --- [http-nio-9092-exec-5] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM learning_resources +2025-04-17 17:39:53.166 DEBUG 894 --- [http-nio-9092-exec-5] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 17:39:53.687 DEBUG 894 --- [http-nio-9092-exec-5] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 17:39:53.687 DEBUG 894 --- [http-nio-9092-exec-7] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-17 17:39:53.689 DEBUG 894 --- [http-nio-9092-exec-5] c.m.m.L.selectList : ==> Preparing: SELECT resource_id,title,type,url,duration,description FROM learning_resources LIMIT ? +2025-04-17 17:39:53.690 DEBUG 894 --- [http-nio-9092-exec-5] c.m.m.L.selectList : ==> Parameters: 2(Integer) +2025-04-17 17:39:53.700 DEBUG 894 --- [http-nio-9092-exec-7] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM legalAidResources +2025-04-17 17:39:53.701 DEBUG 894 --- [http-nio-9092-exec-7] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 17:39:54.049 DEBUG 894 --- [http-nio-9092-exec-5] c.m.m.L.selectList : <== Total: 2 +2025-04-17 17:39:54.049 DEBUG 894 --- [http-nio-9092-exec-10] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-17 17:39:54.050 DEBUG 894 --- [http-nio-9092-exec-7] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 17:39:54.050 DEBUG 894 --- [http-nio-9092-exec-10] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-17 17:39:54.050 DEBUG 894 --- [http-nio-9092-exec-7] c.m.m.L.selectList : ==> Preparing: SELECT aid_id,name,type,phone_number,email,avatar,address,website_url,is_emergency,description FROM legalAidResources LIMIT ? +2025-04-17 17:39:54.050 DEBUG 894 --- [http-nio-9092-exec-7] c.m.m.L.selectList : ==> Parameters: 6(Integer) +2025-04-17 17:39:54.804 DEBUG 894 --- [http-nio-9092-exec-10] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-17 17:39:54.805 DEBUG 894 --- [http-nio-9092-exec-10] c.mingchen.mapper.UserMapper.selectById : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE user_id=? +2025-04-17 17:39:54.806 DEBUG 894 --- [http-nio-9092-exec-10] c.mingchen.mapper.UserMapper.selectById : ==> Parameters: 1(Long) +2025-04-17 17:39:54.812 DEBUG 894 --- [http-nio-9092-exec-7] c.m.m.L.selectList : <== Total: 6 +2025-04-17 17:39:55.382 DEBUG 894 --- [http-nio-9092-exec-10] c.mingchen.mapper.UserMapper.selectById : <== Total: 1 +2025-04-17 17:39:57.010 DEBUG 894 --- [http-nio-9092-exec-8] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-17 17:39:57.011 DEBUG 894 --- [http-nio-9092-exec-8] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-17 17:39:58.795 DEBUG 894 --- [http-nio-9092-exec-1] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-17 17:39:58.796 DEBUG 894 --- [http-nio-9092-exec-1] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-17 17:39:58.796 DEBUG 894 --- [http-nio-9092-exec-8] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-17 17:39:58.800 DEBUG 894 --- [http-nio-9092-exec-8] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM learning_resources +2025-04-17 17:39:58.800 DEBUG 894 --- [http-nio-9092-exec-8] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 17:39:59.966 DEBUG 894 --- [http-nio-9092-exec-8] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 17:39:59.967 DEBUG 894 --- [http-nio-9092-exec-8] c.m.m.L.selectList : ==> Preparing: SELECT resource_id,title,type,url,duration,description FROM learning_resources LIMIT ? +2025-04-17 17:39:59.968 DEBUG 894 --- [http-nio-9092-exec-8] c.m.m.L.selectList : ==> Parameters: 2(Integer) +2025-04-17 17:39:59.971 DEBUG 894 --- [http-nio-9092-exec-1] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-17 17:39:59.972 DEBUG 894 --- [http-nio-9092-exec-1] c.mingchen.mapper.UserMapper.selectById : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE user_id=? +2025-04-17 17:39:59.974 DEBUG 894 --- [http-nio-9092-exec-1] c.mingchen.mapper.UserMapper.selectById : ==> Parameters: 1(Long) +2025-04-17 17:40:01.637 DEBUG 894 --- [http-nio-9092-exec-8] c.m.m.L.selectList : <== Total: 2 +2025-04-17 17:40:01.638 DEBUG 894 --- [http-nio-9092-exec-1] c.mingchen.mapper.UserMapper.selectById : <== Total: 1 +2025-04-17 17:40:04.497 DEBUG 894 --- [http-nio-9092-exec-3] c.mingchen.common.config.JwtLoginFilter : Request is to process authentication +2025-04-17 17:40:04.680 DEBUG 894 --- [http-nio-9092-exec-3] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-17 17:40:04.682 DEBUG 894 --- [http-nio-9092-exec-3] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-17 17:40:05.799 DEBUG 894 --- [http-nio-9092-exec-3] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-17 17:40:05.925 DEBUG 894 --- [http-nio-9092-exec-2] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-17 17:40:05.925 DEBUG 894 --- [http-nio-9092-exec-2] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-17 17:40:06.086 DEBUG 894 --- [http-nio-9092-exec-2] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-17 17:40:06.088 DEBUG 894 --- [http-nio-9092-exec-2] c.m.m.C.getAllCategoriesWithLaws : ==> Preparing: SELECT c.category_id, c.name, c.description, l.law_id, l.category_id AS law_category_id, l.title, l.summary, l.content, l.effective_date, l.reference_url FROM categories c LEFT JOIN laws l ON c.category_id = l.category_id ORDER BY c.category_id, l.law_id +2025-04-17 17:40:06.088 DEBUG 894 --- [http-nio-9092-exec-2] c.m.m.C.getAllCategoriesWithLaws : ==> Parameters: +2025-04-17 17:40:06.355 DEBUG 894 --- [http-nio-9092-exec-2] c.m.m.C.getAllCategoriesWithLaws : <== Total: 6 +2025-04-17 17:40:07.374 DEBUG 894 --- [http-nio-9092-exec-4] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-17 17:40:07.375 DEBUG 894 --- [http-nio-9092-exec-4] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-17 17:40:07.597 DEBUG 894 --- [http-nio-9092-exec-4] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-17 17:40:07.603 DEBUG 894 --- [http-nio-9092-exec-4] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM learning_resources +2025-04-17 17:40:07.604 DEBUG 894 --- [http-nio-9092-exec-4] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 17:40:08.899 DEBUG 894 --- [http-nio-9092-exec-4] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 17:40:08.900 DEBUG 894 --- [http-nio-9092-exec-4] c.m.m.L.selectList : ==> Preparing: SELECT resource_id,title,type,url,duration,description FROM learning_resources LIMIT ? +2025-04-17 17:40:08.901 DEBUG 894 --- [http-nio-9092-exec-4] c.m.m.L.selectList : ==> Parameters: 2(Integer) +2025-04-17 17:40:08.946 DEBUG 894 --- [http-nio-9092-exec-4] c.m.m.L.selectList : <== Total: 2 +2025-04-17 17:42:22.862 DEBUG 894 --- [http-nio-9092-exec-7] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-17 17:42:22.862 DEBUG 894 --- [http-nio-9092-exec-7] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-17 17:42:22.923 DEBUG 894 --- [http-nio-9092-exec-7] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-17 17:42:22.927 DEBUG 894 --- [http-nio-9092-exec-7] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM learning_resources +2025-04-17 17:42:22.928 DEBUG 894 --- [http-nio-9092-exec-7] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 17:42:22.963 DEBUG 894 --- [http-nio-9092-exec-7] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 17:42:22.963 DEBUG 894 --- [http-nio-9092-exec-7] c.m.m.L.selectList : ==> Preparing: SELECT resource_id,title,type,url,duration,description FROM learning_resources LIMIT ? +2025-04-17 17:42:22.964 DEBUG 894 --- [http-nio-9092-exec-7] c.m.m.L.selectList : ==> Parameters: 2(Integer) +2025-04-17 17:42:23.009 DEBUG 894 --- [http-nio-9092-exec-7] c.m.m.L.selectList : <== Total: 2 +2025-04-17 17:42:23.508 DEBUG 894 --- [http-nio-9092-exec-10] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-17 17:42:23.509 DEBUG 894 --- [http-nio-9092-exec-10] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-17 17:42:23.546 DEBUG 894 --- [http-nio-9092-exec-10] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-17 17:42:23.552 DEBUG 894 --- [http-nio-9092-exec-10] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM legalAidResources +2025-04-17 17:42:23.553 DEBUG 894 --- [http-nio-9092-exec-10] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 17:42:23.599 DEBUG 894 --- [http-nio-9092-exec-10] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 17:42:23.600 DEBUG 894 --- [http-nio-9092-exec-10] c.m.m.L.selectList : ==> Preparing: SELECT aid_id,name,type,phone_number,email,avatar,address,website_url,is_emergency,description FROM legalAidResources LIMIT ? +2025-04-17 17:42:23.601 DEBUG 894 --- [http-nio-9092-exec-10] c.m.m.L.selectList : ==> Parameters: 6(Integer) +2025-04-17 17:42:23.653 DEBUG 894 --- [http-nio-9092-exec-10] c.m.m.L.selectList : <== Total: 6 +2025-04-17 17:42:24.186 DEBUG 894 --- [http-nio-9092-exec-8] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-17 17:42:24.186 DEBUG 894 --- [http-nio-9092-exec-8] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-17 17:42:24.253 DEBUG 894 --- [http-nio-9092-exec-8] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-17 17:42:24.254 DEBUG 894 --- [http-nio-9092-exec-8] c.mingchen.mapper.UserMapper.selectById : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE user_id=? +2025-04-17 17:42:24.254 DEBUG 894 --- [http-nio-9092-exec-8] c.mingchen.mapper.UserMapper.selectById : ==> Parameters: 1(Long) +2025-04-17 17:42:24.435 DEBUG 894 --- [http-nio-9092-exec-8] c.mingchen.mapper.UserMapper.selectById : <== Total: 1 +2025-04-17 17:42:27.558 DEBUG 894 --- [http-nio-9092-exec-1] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-17 17:42:27.559 DEBUG 894 --- [http-nio-9092-exec-1] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-17 17:42:27.606 DEBUG 894 --- [http-nio-9092-exec-1] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-17 17:42:27.615 DEBUG 894 --- [http-nio-9092-exec-1] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM legalAidResources +2025-04-17 17:42:27.615 DEBUG 894 --- [http-nio-9092-exec-1] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 17:42:27.661 DEBUG 894 --- [http-nio-9092-exec-1] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 17:42:27.662 DEBUG 894 --- [http-nio-9092-exec-1] c.m.m.L.selectList : ==> Preparing: SELECT aid_id,name,type,phone_number,email,avatar,address,website_url,is_emergency,description FROM legalAidResources LIMIT ? +2025-04-17 17:42:27.662 DEBUG 894 --- [http-nio-9092-exec-1] c.m.m.L.selectList : ==> Parameters: 6(Integer) +2025-04-17 17:42:27.714 DEBUG 894 --- [http-nio-9092-exec-1] c.m.m.L.selectList : <== Total: 6 +2025-04-17 17:42:28.196 DEBUG 894 --- [http-nio-9092-exec-3] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-17 17:42:28.197 DEBUG 894 --- [http-nio-9092-exec-3] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-17 17:42:28.237 DEBUG 894 --- [http-nio-9092-exec-3] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-17 17:42:28.243 DEBUG 894 --- [http-nio-9092-exec-3] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM learning_resources +2025-04-17 17:42:28.244 DEBUG 894 --- [http-nio-9092-exec-3] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 17:42:28.281 DEBUG 894 --- [http-nio-9092-exec-3] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 17:42:28.282 DEBUG 894 --- [http-nio-9092-exec-3] c.m.m.L.selectList : ==> Preparing: SELECT resource_id,title,type,url,duration,description FROM learning_resources LIMIT ? +2025-04-17 17:42:28.283 DEBUG 894 --- [http-nio-9092-exec-3] c.m.m.L.selectList : ==> Parameters: 2(Integer) +2025-04-17 17:42:28.321 DEBUG 894 --- [http-nio-9092-exec-3] c.m.m.L.selectList : <== Total: 2 +2025-04-17 17:42:28.673 DEBUG 894 --- [http-nio-9092-exec-2] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-17 17:42:28.674 DEBUG 894 --- [http-nio-9092-exec-2] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-17 17:42:28.737 DEBUG 894 --- [http-nio-9092-exec-2] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-17 17:42:28.744 DEBUG 894 --- [http-nio-9092-exec-2] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM legalAidResources +2025-04-17 17:42:28.745 DEBUG 894 --- [http-nio-9092-exec-2] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 17:42:28.776 DEBUG 894 --- [http-nio-9092-exec-2] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 17:42:28.777 DEBUG 894 --- [http-nio-9092-exec-2] c.m.m.L.selectList : ==> Preparing: SELECT aid_id,name,type,phone_number,email,avatar,address,website_url,is_emergency,description FROM legalAidResources LIMIT ? +2025-04-17 17:42:28.778 DEBUG 894 --- [http-nio-9092-exec-2] c.m.m.L.selectList : ==> Parameters: 6(Integer) +2025-04-17 17:42:28.822 DEBUG 894 --- [http-nio-9092-exec-2] c.m.m.L.selectList : <== Total: 6 +2025-04-17 17:42:31.675 DEBUG 894 --- [http-nio-9092-exec-9] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-17 17:42:31.677 DEBUG 894 --- [http-nio-9092-exec-9] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-17 17:42:31.722 DEBUG 894 --- [http-nio-9092-exec-9] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-17 17:42:31.730 DEBUG 894 --- [http-nio-9092-exec-9] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM legalAidResources +2025-04-17 17:42:31.731 DEBUG 894 --- [http-nio-9092-exec-9] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 17:42:31.781 DEBUG 894 --- [http-nio-9092-exec-9] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 17:42:31.782 DEBUG 894 --- [http-nio-9092-exec-9] c.m.m.L.selectList : ==> Preparing: SELECT aid_id,name,type,phone_number,email,avatar,address,website_url,is_emergency,description FROM legalAidResources LIMIT ?, ? +2025-04-17 17:42:31.782 DEBUG 894 --- [http-nio-9092-exec-9] c.m.m.L.selectList : ==> Parameters: 6(Integer), 6(Integer) +2025-04-17 17:42:31.819 DEBUG 894 --- [http-nio-9092-exec-9] c.m.m.L.selectList : <== Total: 6 +2025-04-17 17:48:54.154 DEBUG 894 --- [http-nio-9092-exec-6] c.mingchen.common.config.JwtLoginFilter : Request is to process authentication +2025-04-17 17:48:54.207 DEBUG 894 --- [http-nio-9092-exec-6] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-17 17:48:54.208 DEBUG 894 --- [http-nio-9092-exec-6] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-17 17:48:54.393 DEBUG 894 --- [http-nio-9092-exec-6] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-17 17:48:54.569 DEBUG 894 --- [http-nio-9092-exec-7] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-17 17:48:54.569 DEBUG 894 --- [http-nio-9092-exec-7] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-17 17:48:54.757 DEBUG 894 --- [http-nio-9092-exec-7] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-17 17:48:54.758 DEBUG 894 --- [http-nio-9092-exec-7] c.m.m.C.getAllCategoriesWithLaws : ==> Preparing: SELECT c.category_id, c.name, c.description, l.law_id, l.category_id AS law_category_id, l.title, l.summary, l.content, l.effective_date, l.reference_url FROM categories c LEFT JOIN laws l ON c.category_id = l.category_id ORDER BY c.category_id, l.law_id +2025-04-17 17:48:54.758 DEBUG 894 --- [http-nio-9092-exec-7] c.m.m.C.getAllCategoriesWithLaws : ==> Parameters: +2025-04-17 17:48:55.089 DEBUG 894 --- [http-nio-9092-exec-7] c.m.m.C.getAllCategoriesWithLaws : <== Total: 6 +2025-04-17 17:49:02.727 DEBUG 894 --- [http-nio-9092-exec-10] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-17 17:49:02.728 DEBUG 894 --- [http-nio-9092-exec-10] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-17 17:49:02.768 DEBUG 894 --- [http-nio-9092-exec-10] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-17 17:49:02.774 DEBUG 894 --- [http-nio-9092-exec-10] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM learning_resources +2025-04-17 17:49:02.775 DEBUG 894 --- [http-nio-9092-exec-10] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 17:49:02.807 DEBUG 894 --- [http-nio-9092-exec-10] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 17:49:02.808 DEBUG 894 --- [http-nio-9092-exec-10] c.m.m.L.selectList : ==> Preparing: SELECT resource_id,title,type,url,duration,description FROM learning_resources LIMIT ? +2025-04-17 17:49:02.808 DEBUG 894 --- [http-nio-9092-exec-10] c.m.m.L.selectList : ==> Parameters: 2(Integer) +2025-04-17 17:49:02.994 DEBUG 894 --- [http-nio-9092-exec-10] c.m.m.L.selectList : <== Total: 2 +2025-04-17 17:49:33.951 DEBUG 894 --- [http-nio-9092-exec-8] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-17 17:49:33.952 DEBUG 894 --- [http-nio-9092-exec-8] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-17 17:49:33.995 DEBUG 894 --- [http-nio-9092-exec-8] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-17 17:49:34.002 DEBUG 894 --- [http-nio-9092-exec-8] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM legalAidResources +2025-04-17 17:49:34.002 DEBUG 894 --- [http-nio-9092-exec-8] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 17:49:34.193 DEBUG 894 --- [http-nio-9092-exec-8] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 17:49:34.194 DEBUG 894 --- [http-nio-9092-exec-8] c.m.m.L.selectList : ==> Preparing: SELECT aid_id,name,type,phone_number,email,avatar,address,website_url,is_emergency,description FROM legalAidResources LIMIT ? +2025-04-17 17:49:34.194 DEBUG 894 --- [http-nio-9092-exec-8] c.m.m.L.selectList : ==> Parameters: 6(Integer) +2025-04-17 17:49:34.227 DEBUG 894 --- [http-nio-9092-exec-8] c.m.m.L.selectList : <== Total: 6 +2025-04-17 17:49:54.709 DEBUG 894 --- [http-nio-9092-exec-1] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-17 17:49:54.710 DEBUG 894 --- [http-nio-9092-exec-1] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-17 17:49:55.030 DEBUG 894 --- [http-nio-9092-exec-1] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-17 17:49:55.031 DEBUG 894 --- [http-nio-9092-exec-1] c.mingchen.mapper.UserMapper.selectById : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE user_id=? +2025-04-17 17:49:55.031 DEBUG 894 --- [http-nio-9092-exec-1] c.mingchen.mapper.UserMapper.selectById : ==> Parameters: 1(Long) +2025-04-17 17:49:55.070 DEBUG 894 --- [http-nio-9092-exec-1] c.mingchen.mapper.UserMapper.selectById : <== Total: 1 +2025-04-17 17:49:58.241 DEBUG 894 --- [http-nio-9092-exec-3] c.mingchen.common.config.JwtLoginFilter : Request is to process authentication +2025-04-17 17:49:58.305 DEBUG 894 --- [http-nio-9092-exec-3] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-17 17:49:58.311 DEBUG 894 --- [http-nio-9092-exec-3] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-17 17:49:58.362 DEBUG 894 --- [http-nio-9092-exec-3] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-17 17:49:58.492 DEBUG 894 --- [http-nio-9092-exec-2] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-17 17:49:58.492 DEBUG 894 --- [http-nio-9092-exec-2] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-17 17:49:58.545 DEBUG 894 --- [http-nio-9092-exec-2] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-17 17:49:58.545 DEBUG 894 --- [http-nio-9092-exec-2] c.m.m.C.getAllCategoriesWithLaws : ==> Preparing: SELECT c.category_id, c.name, c.description, l.law_id, l.category_id AS law_category_id, l.title, l.summary, l.content, l.effective_date, l.reference_url FROM categories c LEFT JOIN laws l ON c.category_id = l.category_id ORDER BY c.category_id, l.law_id +2025-04-17 17:49:58.545 DEBUG 894 --- [http-nio-9092-exec-2] c.m.m.C.getAllCategoriesWithLaws : ==> Parameters: +2025-04-17 17:49:58.602 DEBUG 894 --- [http-nio-9092-exec-2] c.m.m.C.getAllCategoriesWithLaws : <== Total: 6 +2025-04-17 17:50:02.564 DEBUG 894 --- [http-nio-9092-exec-4] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-17 17:50:02.565 DEBUG 894 --- [http-nio-9092-exec-4] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-17 17:50:02.726 DEBUG 894 --- [http-nio-9092-exec-4] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-17 17:50:02.731 DEBUG 894 --- [http-nio-9092-exec-4] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM learning_resources +2025-04-17 17:50:02.731 DEBUG 894 --- [http-nio-9092-exec-4] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 17:50:03.062 DEBUG 894 --- [http-nio-9092-exec-4] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 17:50:03.063 DEBUG 894 --- [http-nio-9092-exec-4] c.m.m.L.selectList : ==> Preparing: SELECT resource_id,title,type,url,duration,description FROM learning_resources LIMIT ? +2025-04-17 17:50:03.064 DEBUG 894 --- [http-nio-9092-exec-4] c.m.m.L.selectList : ==> Parameters: 2(Integer) +2025-04-17 17:50:03.105 DEBUG 894 --- [http-nio-9092-exec-4] c.m.m.L.selectList : <== Total: 2 +2025-04-17 17:50:05.152 DEBUG 894 --- [http-nio-9092-exec-9] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-17 17:50:05.153 DEBUG 894 --- [http-nio-9092-exec-9] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-17 17:50:05.632 DEBUG 894 --- [http-nio-9092-exec-9] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-17 17:50:05.640 DEBUG 894 --- [http-nio-9092-exec-9] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM legalAidResources +2025-04-17 17:50:05.641 DEBUG 894 --- [http-nio-9092-exec-9] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 17:50:05.819 DEBUG 894 --- [http-nio-9092-exec-9] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 17:50:05.820 DEBUG 894 --- [http-nio-9092-exec-9] c.m.m.L.selectList : ==> Preparing: SELECT aid_id,name,type,phone_number,email,avatar,address,website_url,is_emergency,description FROM legalAidResources LIMIT ? +2025-04-17 17:50:05.820 DEBUG 894 --- [http-nio-9092-exec-9] c.m.m.L.selectList : ==> Parameters: 6(Integer) +2025-04-17 17:50:05.876 DEBUG 894 --- [http-nio-9092-exec-9] c.m.m.L.selectList : <== Total: 6 +2025-04-17 17:50:08.487 DEBUG 894 --- [http-nio-9092-exec-5] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-17 17:50:08.488 DEBUG 894 --- [http-nio-9092-exec-5] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-17 17:50:08.829 DEBUG 894 --- [http-nio-9092-exec-5] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-17 17:50:08.830 DEBUG 894 --- [http-nio-9092-exec-5] c.mingchen.mapper.UserMapper.selectById : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE user_id=? +2025-04-17 17:50:08.830 DEBUG 894 --- [http-nio-9092-exec-5] c.mingchen.mapper.UserMapper.selectById : ==> Parameters: 1(Long) +2025-04-17 17:50:08.866 DEBUG 894 --- [http-nio-9092-exec-5] c.mingchen.mapper.UserMapper.selectById : <== Total: 1 +2025-04-17 18:08:02.201 DEBUG 894 --- [http-nio-9092-exec-7] c.mingchen.common.config.JwtLoginFilter : Request is to process authentication +2025-04-17 18:08:02.252 DEBUG 894 --- [http-nio-9092-exec-7] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-17 18:08:02.253 DEBUG 894 --- [http-nio-9092-exec-7] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-17 18:08:02.293 DEBUG 894 --- [http-nio-9092-exec-7] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-17 18:08:02.458 DEBUG 894 --- [http-nio-9092-exec-10] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-17 18:08:02.458 DEBUG 894 --- [http-nio-9092-exec-10] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-17 18:08:02.488 DEBUG 894 --- [http-nio-9092-exec-10] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-17 18:08:02.489 DEBUG 894 --- [http-nio-9092-exec-10] c.m.m.C.getAllCategoriesWithLaws : ==> Preparing: SELECT c.category_id, c.name, c.description, l.law_id, l.category_id AS law_category_id, l.title, l.summary, l.content, l.effective_date, l.reference_url FROM categories c LEFT JOIN laws l ON c.category_id = l.category_id ORDER BY c.category_id, l.law_id +2025-04-17 18:08:02.489 DEBUG 894 --- [http-nio-9092-exec-10] c.m.m.C.getAllCategoriesWithLaws : ==> Parameters: +2025-04-17 18:08:02.537 DEBUG 894 --- [http-nio-9092-exec-10] c.m.m.C.getAllCategoriesWithLaws : <== Total: 6 +2025-04-17 18:08:31.952 DEBUG 894 --- [http-nio-9092-exec-1] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-17 18:08:31.953 DEBUG 894 --- [http-nio-9092-exec-1] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-17 18:08:31.993 DEBUG 894 --- [http-nio-9092-exec-1] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-17 18:09:10.772 WARN 894 --- [http-nio-9092-exec-2] com.zaxxer.hikari.pool.PoolBase : HikariPool-1 - Failed to validate connection com.mysql.cj.jdbc.ConnectionImpl@17f2a0c0 (No operations allowed after connection closed.). Possibly consider using a shorter maxLifetime value. +2025-04-17 18:09:10.813 DEBUG 894 --- [http-nio-9092-exec-2] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-17 18:09:10.814 DEBUG 894 --- [http-nio-9092-exec-2] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-17 18:09:10.844 DEBUG 894 --- [http-nio-9092-exec-2] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-17 18:09:22.693 DEBUG 894 --- [http-nio-9092-exec-4] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-17 18:09:22.693 DEBUG 894 --- [http-nio-9092-exec-4] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-17 18:09:22.723 DEBUG 894 --- [http-nio-9092-exec-4] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-17 18:09:22.730 DEBUG 894 --- [http-nio-9092-exec-4] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM learning_resources +2025-04-17 18:09:22.730 DEBUG 894 --- [http-nio-9092-exec-4] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 18:09:22.770 DEBUG 894 --- [http-nio-9092-exec-4] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 18:09:22.771 DEBUG 894 --- [http-nio-9092-exec-4] c.m.m.L.selectList : ==> Preparing: SELECT resource_id,title,type,url,duration,description FROM learning_resources LIMIT ? +2025-04-17 18:09:22.772 DEBUG 894 --- [http-nio-9092-exec-4] c.m.m.L.selectList : ==> Parameters: 2(Integer) +2025-04-17 18:09:22.809 DEBUG 894 --- [http-nio-9092-exec-4] c.m.m.L.selectList : <== Total: 2 +2025-04-17 18:09:27.235 DEBUG 894 --- [http-nio-9092-exec-9] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-17 18:09:27.236 DEBUG 894 --- [http-nio-9092-exec-9] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-17 18:09:27.264 DEBUG 894 --- [http-nio-9092-exec-9] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-17 18:09:27.271 DEBUG 894 --- [http-nio-9092-exec-9] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM legalAidResources +2025-04-17 18:09:27.271 DEBUG 894 --- [http-nio-9092-exec-9] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 18:09:27.304 DEBUG 894 --- [http-nio-9092-exec-9] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 18:09:27.304 DEBUG 894 --- [http-nio-9092-exec-9] c.m.m.L.selectList : ==> Preparing: SELECT aid_id,name,type,phone_number,email,avatar,address,website_url,is_emergency,description FROM legalAidResources LIMIT ? +2025-04-17 18:09:27.305 DEBUG 894 --- [http-nio-9092-exec-9] c.m.m.L.selectList : ==> Parameters: 6(Integer) +2025-04-17 18:09:27.344 DEBUG 894 --- [http-nio-9092-exec-9] c.m.m.L.selectList : <== Total: 6 +2025-04-17 18:09:44.688 WARN 894 --- [http-nio-9092-exec-6] com.zaxxer.hikari.pool.PoolBase : HikariPool-1 - Failed to validate connection com.mysql.cj.jdbc.ConnectionImpl@3ef93f8d (No operations allowed after connection closed.). Possibly consider using a shorter maxLifetime value. +2025-04-17 18:09:49.691 WARN 894 --- [http-nio-9092-exec-6] com.zaxxer.hikari.pool.PoolBase : HikariPool-1 - Failed to validate connection com.mysql.cj.jdbc.ConnectionImpl@3ac6bc8a (No operations allowed after connection closed.). Possibly consider using a shorter maxLifetime value. +2025-04-17 18:09:50.043 WARN 894 --- [http-nio-9092-exec-7] com.zaxxer.hikari.pool.PoolBase : HikariPool-1 - Failed to validate connection com.mysql.cj.jdbc.ConnectionImpl@666d7a (No operations allowed after connection closed.). Possibly consider using a shorter maxLifetime value. +2025-04-17 18:09:50.082 DEBUG 894 --- [http-nio-9092-exec-7] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-17 18:09:50.082 DEBUG 894 --- [http-nio-9092-exec-7] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-17 18:09:50.113 DEBUG 894 --- [http-nio-9092-exec-7] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-17 18:09:50.118 DEBUG 894 --- [http-nio-9092-exec-7] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM learning_resources +2025-04-17 18:09:50.118 DEBUG 894 --- [http-nio-9092-exec-7] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-17 18:09:50.165 DEBUG 894 --- [http-nio-9092-exec-7] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-17 18:09:50.166 DEBUG 894 --- [http-nio-9092-exec-7] c.m.m.L.selectList : ==> Preparing: SELECT resource_id,title,type,url,duration,description FROM learning_resources LIMIT ? +2025-04-17 18:09:50.166 DEBUG 894 --- [http-nio-9092-exec-7] c.m.m.L.selectList : ==> Parameters: 2(Integer) +2025-04-17 18:09:50.207 DEBUG 894 --- [http-nio-9092-exec-7] c.m.m.L.selectList : <== Total: 2 +2025-04-17 18:09:54.695 WARN 894 --- [http-nio-9092-exec-6] com.zaxxer.hikari.pool.PoolBase : HikariPool-1 - Failed to validate connection com.mysql.cj.jdbc.ConnectionImpl@3903bcb3 (No operations allowed after connection closed.). Possibly consider using a shorter maxLifetime value. +2025-04-17 18:09:54.740 DEBUG 894 --- [http-nio-9092-exec-6] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-17 18:09:54.740 DEBUG 894 --- [http-nio-9092-exec-6] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-17 18:09:54.773 DEBUG 894 --- [http-nio-9092-exec-6] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-17 18:09:54.774 DEBUG 894 --- [http-nio-9092-exec-6] c.mingchen.mapper.UserMapper.selectById : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE user_id=? +2025-04-17 18:09:54.775 DEBUG 894 --- [http-nio-9092-exec-6] c.mingchen.mapper.UserMapper.selectById : ==> Parameters: 1(Long) +2025-04-17 18:09:54.820 DEBUG 894 --- [http-nio-9092-exec-6] c.mingchen.mapper.UserMapper.selectById : <== Total: 1 +2025-04-17 18:10:12.362 DEBUG 894 --- [http-nio-9092-exec-10] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-17 18:10:12.363 DEBUG 894 --- [http-nio-9092-exec-10] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-17 18:10:12.400 DEBUG 894 --- [http-nio-9092-exec-10] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-17 18:10:12.401 DEBUG 894 --- [http-nio-9092-exec-10] c.m.m.C.getAllCategoriesWithLaws : ==> Preparing: SELECT c.category_id, c.name, c.description, l.law_id, l.category_id AS law_category_id, l.title, l.summary, l.content, l.effective_date, l.reference_url FROM categories c LEFT JOIN laws l ON c.category_id = l.category_id ORDER BY c.category_id, l.law_id +2025-04-17 18:10:12.402 DEBUG 894 --- [http-nio-9092-exec-10] c.m.m.C.getAllCategoriesWithLaws : ==> Parameters: +2025-04-17 18:10:12.449 DEBUG 894 --- [http-nio-9092-exec-10] c.m.m.C.getAllCategoriesWithLaws : <== Total: 6 +2025-04-17 18:14:38.421 DEBUG 894 --- [http-nio-9092-exec-2] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-17 18:14:38.421 DEBUG 894 --- [http-nio-9092-exec-2] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-17 18:14:38.450 DEBUG 894 --- [http-nio-9092-exec-2] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-17 18:18:13.111 INFO 894 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED paused. +2025-04-17 18:18:13.112 INFO 894 --- [SpringContextShutdownHook] o.s.s.quartz.SchedulerFactoryBean : Shutting down Quartz Scheduler +2025-04-17 18:18:13.112 INFO 894 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED shutting down. +2025-04-17 18:18:13.112 INFO 894 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED paused. +2025-04-17 18:18:13.112 INFO 894 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED shutdown complete. +2025-04-17 18:18:13.113 INFO 894 --- [SpringContextShutdownHook] o.s.s.concurrent.ThreadPoolTaskExecutor : Shutting down ExecutorService 'applicationTaskExecutor' +2025-04-17 18:18:13.119 INFO 894 --- [SpringContextShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown initiated... +2025-04-17 18:18:13.120 INFO 894 --- [SpringContextShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown completed. diff --git a/log/blog-dev/spring.log-2025-04-18-0.log b/log/blog-dev/spring.log-2025-04-18-0.log new file mode 100644 index 0000000..5c08d72 --- /dev/null +++ b/log/blog-dev/spring.log-2025-04-18-0.log @@ -0,0 +1,435 @@ +2025-04-18 08:29:34.690 INFO 1487 --- [restartedMain] com.mingchen.BlogApiApplication : Starting BlogApiApplication on mingchendeMac-mini.local with PID 1487 (/Users/mingchen/code/java/other/legalAid/api/target/classes started by mingchen in /Users/mingchen/code/java/other/legalAid) +2025-04-18 08:29:34.692 DEBUG 1487 --- [restartedMain] com.mingchen.BlogApiApplication : Running with Spring Boot v2.2.7.RELEASE, Spring v5.2.6.RELEASE +2025-04-18 08:29:34.692 INFO 1487 --- [restartedMain] com.mingchen.BlogApiApplication : The following profiles are active: dev +2025-04-18 08:29:34.714 INFO 1487 --- [restartedMain] o.s.b.devtools.restart.ChangeableUrls : The Class-Path manifest attribute in /usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/jaxb-runtime-2.3.1.jar referenced one or more files that do not exist: file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/jaxb-api-2.3.1.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/txw2-2.3.1.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/istack-commons-runtime-3.0.7.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/stax-ex-1.8.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/FastInfoset-1.2.15.jar,file:/usr/local/apache-maven-3.6.3/data/org/glassfish/jaxb/jaxb-runtime/2.3.1/javax.activation-api-1.2.0.jar +2025-04-18 08:29:34.714 INFO 1487 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : Devtools property defaults active! Set 'spring.devtools.add-properties' to 'false' to disable +2025-04-18 08:29:34.714 INFO 1487 --- [restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : For additional web related logging consider setting the 'logging.level.web' property to 'DEBUG' +2025-04-18 08:29:34.981 INFO 1487 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Multiple Spring Data modules found, entering strict repository configuration mode! +2025-04-18 08:29:34.982 INFO 1487 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data Redis repositories in DEFAULT mode. +2025-04-18 08:29:34.996 INFO 1487 --- [restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 8ms. Found 0 Redis repository interfaces. +2025-04-18 08:29:35.288 INFO 1487 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 9092 (http) +2025-04-18 08:29:35.291 INFO 1487 --- [restartedMain] o.apache.catalina.core.StandardService : Starting service [Tomcat] +2025-04-18 08:29:35.291 INFO 1487 --- [restartedMain] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.34] +2025-04-18 08:29:35.314 INFO 1487 --- [restartedMain] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext +2025-04-18 08:29:35.315 INFO 1487 --- [restartedMain] o.s.web.context.ContextLoader : Root WebApplicationContext: initialization completed in 601 ms +2025-04-18 08:29:35.831 INFO 1487 --- [restartedMain] n.b.p.u.AbstractUserAgentAnalyzerDirect : - Loaded 90 files in 200 msec using expression: classpath*:UserAgents/**/*.yaml +2025-04-18 08:29:35.831 INFO 1487 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : +2025-04-18 08:29:35.831 INFO 1487 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : /-----------------------------------------------------------\ +2025-04-18 08:29:35.831 INFO 1487 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : | Yauaa 5.20 (v5.20 @ 2020-11-22T15:39:16Z) | +2025-04-18 08:29:35.831 INFO 1487 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : +-----------------------------------------------------------+ +2025-04-18 08:29:35.831 INFO 1487 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : | For more information: https://yauaa.basjes.nl | +2025-04-18 08:29:35.831 INFO 1487 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : | Copyright (C) 2013-2020 Niels Basjes - License Apache 2.0 | +2025-04-18 08:29:35.831 INFO 1487 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : \-----------------------------------------------------------/ +2025-04-18 08:29:35.831 INFO 1487 --- [restartedMain] n.b.parse.useragent.utils.YauaaVersion : +2025-04-18 08:29:35.835 INFO 1487 --- [restartedMain] n.b.p.u.AbstractUserAgentAnalyzerDirect : Building all needed matchers for the requested 11 fields. +2025-04-18 08:29:35.890 INFO 1487 --- [restartedMain] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor' +2025-04-18 08:29:35.966 INFO 1487 --- [restartedMain] org.quartz.impl.StdSchedulerFactory : Using default implementation for ThreadExecutor +2025-04-18 08:29:35.970 INFO 1487 --- [restartedMain] org.quartz.core.SchedulerSignalerImpl : Initialized Scheduler Signaller of type: class org.quartz.core.SchedulerSignalerImpl +2025-04-18 08:29:35.970 INFO 1487 --- [restartedMain] org.quartz.core.QuartzScheduler : Quartz Scheduler v.2.3.2 created. +2025-04-18 08:29:35.970 INFO 1487 --- [restartedMain] org.quartz.simpl.RAMJobStore : RAMJobStore initialized. +2025-04-18 08:29:35.970 INFO 1487 --- [restartedMain] org.quartz.core.QuartzScheduler : Scheduler meta-data: Quartz Scheduler (v2.3.2) 'quartzScheduler' with instanceId 'NON_CLUSTERED' + Scheduler class: 'org.quartz.core.QuartzScheduler' - running locally. + NOT STARTED. + Currently in standby mode. + Number of jobs executed: 0 + Using thread pool 'org.quartz.simpl.SimpleThreadPool' - with 10 threads. + Using job-store 'org.quartz.simpl.RAMJobStore' - which does not support persistence. and is not clustered. + +2025-04-18 08:29:35.970 INFO 1487 --- [restartedMain] org.quartz.impl.StdSchedulerFactory : Quartz scheduler 'quartzScheduler' initialized from an externally provided properties instance. +2025-04-18 08:29:35.970 INFO 1487 --- [restartedMain] org.quartz.impl.StdSchedulerFactory : Quartz scheduler version: 2.3.2 +2025-04-18 08:29:35.970 INFO 1487 --- [restartedMain] org.quartz.core.QuartzScheduler : JobFactory set to: org.springframework.scheduling.quartz.SpringBeanJobFactory@26c14a35 +2025-04-18 08:29:36.001 INFO 1487 --- [restartedMain] o.s.s.web.DefaultSecurityFilterChain : Creating filter chain: any request, [org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter@3c1ef68e, org.springframework.security.web.context.SecurityContextPersistenceFilter@59ac7439, org.springframework.security.web.header.HeaderWriterFilter@605756ca, org.springframework.web.filter.CorsFilter@4ca09908, org.springframework.security.web.authentication.logout.LogoutFilter@50d8e3cb, com.mingchen.common.config.JwtLoginFilter@16ff6bf1, com.mingchen.common.config.JwtFilter@1b7c0441, org.springframework.security.web.savedrequest.RequestCacheAwareFilter@39f258b4, org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter@2f44a423, org.springframework.security.web.authentication.AnonymousAuthenticationFilter@509d2b26, org.springframework.security.web.session.SessionManagementFilter@420b416e, org.springframework.security.web.access.ExceptionTranslationFilter@23feafdc, org.springframework.security.web.access.intercept.FilterSecurityInterceptor@3db6af02] +2025-04-18 08:29:36.011 INFO 1487 --- [restartedMain] o.s.b.d.a.OptionalLiveReloadServer : LiveReload server is running on port 35729 +2025-04-18 08:29:36.020 INFO 1487 --- [restartedMain] o.s.s.quartz.SchedulerFactoryBean : Starting Quartz Scheduler now +2025-04-18 08:29:36.020 INFO 1487 --- [restartedMain] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED started. +2025-04-18 08:29:36.029 INFO 1487 --- [restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 9092 (http) with context path '' +2025-04-18 08:29:36.031 INFO 1487 --- [restartedMain] com.mingchen.BlogApiApplication : Started BlogApiApplication in 1.524 seconds (JVM running for 2.121) +2025-04-18 08:29:45.173 INFO 1487 --- [http-nio-9092-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet' +2025-04-18 08:29:45.173 INFO 1487 --- [http-nio-9092-exec-1] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet' +2025-04-18 08:29:45.177 INFO 1487 --- [http-nio-9092-exec-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 3 ms +2025-04-18 08:29:45.192 DEBUG 1487 --- [http-nio-9092-exec-2] c.mingchen.common.config.JwtLoginFilter : Request is to process authentication +2025-04-18 08:29:45.235 INFO 1487 --- [http-nio-9092-exec-2] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting... +2025-04-18 08:29:45.692 INFO 1487 --- [http-nio-9092-exec-2] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed. +2025-04-18 08:29:45.703 DEBUG 1487 --- [http-nio-9092-exec-2] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-18 08:29:45.726 DEBUG 1487 --- [http-nio-9092-exec-2] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-18 08:29:45.790 DEBUG 1487 --- [http-nio-9092-exec-2] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-18 08:29:46.063 DEBUG 1487 --- [http-nio-9092-exec-4] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-18 08:29:46.064 DEBUG 1487 --- [http-nio-9092-exec-4] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-18 08:29:46.100 DEBUG 1487 --- [http-nio-9092-exec-4] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-18 08:29:46.108 DEBUG 1487 --- [http-nio-9092-exec-4] c.m.m.C.getAllCategoriesWithLaws : ==> Preparing: SELECT c.category_id, c.name, c.description, l.law_id, l.category_id AS law_category_id, l.title, l.summary, l.content, l.effective_date, l.reference_url FROM categories c LEFT JOIN laws l ON c.category_id = l.category_id ORDER BY c.category_id, l.law_id +2025-04-18 08:29:46.108 DEBUG 1487 --- [http-nio-9092-exec-4] c.m.m.C.getAllCategoriesWithLaws : ==> Parameters: +2025-04-18 08:29:46.157 DEBUG 1487 --- [http-nio-9092-exec-4] c.m.m.C.getAllCategoriesWithLaws : <== Total: 6 +2025-04-18 08:29:50.640 DEBUG 1487 --- [http-nio-9092-exec-5] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-18 08:29:50.640 DEBUG 1487 --- [http-nio-9092-exec-5] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-18 08:29:50.689 DEBUG 1487 --- [http-nio-9092-exec-5] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-18 08:29:50.691 DEBUG 1487 --- [http-nio-9092-exec-5] c.m.m.C.getAllCategoriesWithLaws : ==> Preparing: SELECT c.category_id, c.name, c.description, l.law_id, l.category_id AS law_category_id, l.title, l.summary, l.content, l.effective_date, l.reference_url FROM categories c LEFT JOIN laws l ON c.category_id = l.category_id ORDER BY c.category_id, l.law_id +2025-04-18 08:29:50.691 DEBUG 1487 --- [http-nio-9092-exec-5] c.m.m.C.getAllCategoriesWithLaws : ==> Parameters: +2025-04-18 08:29:50.746 DEBUG 1487 --- [http-nio-9092-exec-5] c.m.m.C.getAllCategoriesWithLaws : <== Total: 6 +2025-04-18 08:29:53.198 DEBUG 1487 --- [http-nio-9092-exec-7] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-18 08:29:53.199 DEBUG 1487 --- [http-nio-9092-exec-7] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-18 08:29:53.232 DEBUG 1487 --- [http-nio-9092-exec-7] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-18 08:29:53.291 DEBUG 1487 --- [http-nio-9092-exec-7] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM learning_resources +2025-04-18 08:29:53.291 DEBUG 1487 --- [http-nio-9092-exec-7] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-18 08:29:53.328 DEBUG 1487 --- [http-nio-9092-exec-7] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-18 08:29:53.329 DEBUG 1487 --- [http-nio-9092-exec-7] c.m.m.L.selectList : ==> Preparing: SELECT resource_id,title,type,url,duration,description FROM learning_resources LIMIT ? +2025-04-18 08:29:53.329 DEBUG 1487 --- [http-nio-9092-exec-7] c.m.m.L.selectList : ==> Parameters: 2(Integer) +2025-04-18 08:29:53.368 DEBUG 1487 --- [http-nio-9092-exec-7] c.m.m.L.selectList : <== Total: 2 +2025-04-18 08:33:34.161 DEBUG 1487 --- [http-nio-9092-exec-9] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-18 08:33:34.161 DEBUG 1487 --- [http-nio-9092-exec-9] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-18 08:33:34.204 DEBUG 1487 --- [http-nio-9092-exec-9] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-18 08:33:34.205 DEBUG 1487 --- [http-nio-9092-exec-9] c.m.m.C.getAllCategoriesWithLaws : ==> Preparing: SELECT c.category_id, c.name, c.description, l.law_id, l.category_id AS law_category_id, l.title, l.summary, l.content, l.effective_date, l.reference_url FROM categories c LEFT JOIN laws l ON c.category_id = l.category_id ORDER BY c.category_id, l.law_id +2025-04-18 08:33:34.205 DEBUG 1487 --- [http-nio-9092-exec-9] c.m.m.C.getAllCategoriesWithLaws : ==> Parameters: +2025-04-18 08:33:34.266 DEBUG 1487 --- [http-nio-9092-exec-9] c.m.m.C.getAllCategoriesWithLaws : <== Total: 6 +2025-04-18 08:38:50.578 DEBUG 1487 --- [http-nio-9092-exec-2] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-18 08:38:50.578 DEBUG 1487 --- [http-nio-9092-exec-2] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-18 08:38:50.627 DEBUG 1487 --- [http-nio-9092-exec-2] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-18 08:38:50.644 DEBUG 1487 --- [http-nio-9092-exec-2] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM legalAidResources +2025-04-18 08:38:50.647 DEBUG 1487 --- [http-nio-9092-exec-2] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-18 08:38:50.695 DEBUG 1487 --- [http-nio-9092-exec-2] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-18 08:38:50.696 DEBUG 1487 --- [http-nio-9092-exec-2] c.m.m.L.selectList : ==> Preparing: SELECT aid_id,name,type,phone_number,email,avatar,address,website_url,is_emergency,description FROM legalAidResources LIMIT ? +2025-04-18 08:38:50.696 DEBUG 1487 --- [http-nio-9092-exec-2] c.m.m.L.selectList : ==> Parameters: 6(Integer) +2025-04-18 08:38:50.729 DEBUG 1487 --- [http-nio-9092-exec-2] c.m.m.L.selectList : <== Total: 6 +2025-04-18 08:38:51.122 DEBUG 1487 --- [http-nio-9092-exec-4] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-18 08:38:51.123 DEBUG 1487 --- [http-nio-9092-exec-4] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-18 08:38:51.166 DEBUG 1487 --- [http-nio-9092-exec-4] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-18 08:38:51.169 DEBUG 1487 --- [http-nio-9092-exec-4] c.mingchen.mapper.UserMapper.selectById : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE user_id=? +2025-04-18 08:38:51.170 DEBUG 1487 --- [http-nio-9092-exec-4] c.mingchen.mapper.UserMapper.selectById : ==> Parameters: 1(Long) +2025-04-18 08:38:51.216 DEBUG 1487 --- [http-nio-9092-exec-4] c.mingchen.mapper.UserMapper.selectById : <== Total: 1 +2025-04-18 08:38:55.148 DEBUG 1487 --- [http-nio-9092-exec-5] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-18 08:38:55.150 DEBUG 1487 --- [http-nio-9092-exec-5] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-18 08:38:55.192 DEBUG 1487 --- [http-nio-9092-exec-5] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-18 08:38:55.199 DEBUG 1487 --- [http-nio-9092-exec-5] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM learning_resources +2025-04-18 08:38:55.200 DEBUG 1487 --- [http-nio-9092-exec-5] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-18 08:38:55.243 DEBUG 1487 --- [http-nio-9092-exec-5] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-18 08:38:55.244 DEBUG 1487 --- [http-nio-9092-exec-5] c.m.m.L.selectList : ==> Preparing: SELECT resource_id,title,type,url,duration,description FROM learning_resources LIMIT ? +2025-04-18 08:38:55.245 DEBUG 1487 --- [http-nio-9092-exec-5] c.m.m.L.selectList : ==> Parameters: 2(Integer) +2025-04-18 08:38:55.284 DEBUG 1487 --- [http-nio-9092-exec-5] c.m.m.L.selectList : <== Total: 2 +2025-04-18 08:38:56.419 DEBUG 1487 --- [http-nio-9092-exec-6] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-18 08:38:56.420 DEBUG 1487 --- [http-nio-9092-exec-6] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-18 08:38:56.461 DEBUG 1487 --- [http-nio-9092-exec-6] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-18 08:38:56.471 DEBUG 1487 --- [http-nio-9092-exec-6] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM legalAidResources +2025-04-18 08:38:56.471 DEBUG 1487 --- [http-nio-9092-exec-6] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-18 08:38:56.509 DEBUG 1487 --- [http-nio-9092-exec-6] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-18 08:38:56.509 DEBUG 1487 --- [http-nio-9092-exec-6] c.m.m.L.selectList : ==> Preparing: SELECT aid_id,name,type,phone_number,email,avatar,address,website_url,is_emergency,description FROM legalAidResources LIMIT ? +2025-04-18 08:38:56.510 DEBUG 1487 --- [http-nio-9092-exec-6] c.m.m.L.selectList : ==> Parameters: 6(Integer) +2025-04-18 08:38:56.551 DEBUG 1487 --- [http-nio-9092-exec-6] c.m.m.L.selectList : <== Total: 6 +2025-04-18 08:38:57.168 DEBUG 1487 --- [http-nio-9092-exec-7] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-18 08:38:57.169 DEBUG 1487 --- [http-nio-9092-exec-7] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-18 08:38:57.210 DEBUG 1487 --- [http-nio-9092-exec-7] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-18 08:38:57.216 DEBUG 1487 --- [http-nio-9092-exec-7] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM learning_resources +2025-04-18 08:38:57.217 DEBUG 1487 --- [http-nio-9092-exec-7] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-18 08:38:57.248 DEBUG 1487 --- [http-nio-9092-exec-7] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-18 08:38:57.250 DEBUG 1487 --- [http-nio-9092-exec-7] c.m.m.L.selectList : ==> Preparing: SELECT resource_id,title,type,url,duration,description FROM learning_resources LIMIT ? +2025-04-18 08:38:57.251 DEBUG 1487 --- [http-nio-9092-exec-7] c.m.m.L.selectList : ==> Parameters: 2(Integer) +2025-04-18 08:38:57.289 DEBUG 1487 --- [http-nio-9092-exec-7] c.m.m.L.selectList : <== Total: 2 +2025-04-18 08:40:15.979 DEBUG 1487 --- [http-nio-9092-exec-9] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-18 08:40:15.980 DEBUG 1487 --- [http-nio-9092-exec-9] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-18 08:40:16.022 DEBUG 1487 --- [http-nio-9092-exec-9] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-18 08:40:16.024 DEBUG 1487 --- [http-nio-9092-exec-9] c.m.m.C.getAllCategoriesWithLaws : ==> Preparing: SELECT c.category_id, c.name, c.description, l.law_id, l.category_id AS law_category_id, l.title, l.summary, l.content, l.effective_date, l.reference_url FROM categories c LEFT JOIN laws l ON c.category_id = l.category_id ORDER BY c.category_id, l.law_id +2025-04-18 08:40:16.024 DEBUG 1487 --- [http-nio-9092-exec-9] c.m.m.C.getAllCategoriesWithLaws : ==> Parameters: +2025-04-18 08:40:16.070 DEBUG 1487 --- [http-nio-9092-exec-9] c.m.m.C.getAllCategoriesWithLaws : <== Total: 6 +2025-04-18 08:44:12.784 DEBUG 1487 --- [http-nio-9092-exec-1] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-18 08:44:12.784 DEBUG 1487 --- [http-nio-9092-exec-1] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-18 08:44:12.831 DEBUG 1487 --- [http-nio-9092-exec-1] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-18 08:44:12.832 DEBUG 1487 --- [http-nio-9092-exec-1] c.m.m.C.getAllCategoriesWithLaws : ==> Preparing: SELECT c.category_id, c.name, c.description, l.law_id, l.category_id AS law_category_id, l.title, l.summary, l.content, l.effective_date, l.reference_url FROM categories c LEFT JOIN laws l ON c.category_id = l.category_id ORDER BY c.category_id, l.law_id +2025-04-18 08:44:12.832 DEBUG 1487 --- [http-nio-9092-exec-1] c.m.m.C.getAllCategoriesWithLaws : ==> Parameters: +2025-04-18 08:44:12.896 DEBUG 1487 --- [http-nio-9092-exec-1] c.m.m.C.getAllCategoriesWithLaws : <== Total: 6 +2025-04-18 08:44:33.744 DEBUG 1487 --- [http-nio-9092-exec-2] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-18 08:44:33.745 DEBUG 1487 --- [http-nio-9092-exec-2] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-18 08:44:33.785 DEBUG 1487 --- [http-nio-9092-exec-2] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-18 08:44:33.794 DEBUG 1487 --- [http-nio-9092-exec-2] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM legalAidResources +2025-04-18 08:44:33.795 DEBUG 1487 --- [http-nio-9092-exec-2] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-18 08:44:33.845 DEBUG 1487 --- [http-nio-9092-exec-2] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-18 08:44:33.846 DEBUG 1487 --- [http-nio-9092-exec-2] c.m.m.L.selectList : ==> Preparing: SELECT aid_id,name,type,phone_number,email,avatar,address,website_url,is_emergency,description FROM legalAidResources LIMIT ? +2025-04-18 08:44:33.846 DEBUG 1487 --- [http-nio-9092-exec-2] c.m.m.L.selectList : ==> Parameters: 6(Integer) +2025-04-18 08:44:33.889 DEBUG 1487 --- [http-nio-9092-exec-2] c.m.m.L.selectList : <== Total: 6 +2025-04-18 08:44:34.684 DEBUG 1487 --- [http-nio-9092-exec-3] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-18 08:44:34.685 DEBUG 1487 --- [http-nio-9092-exec-3] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-18 08:44:34.726 DEBUG 1487 --- [http-nio-9092-exec-3] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-18 08:44:34.727 DEBUG 1487 --- [http-nio-9092-exec-3] c.mingchen.mapper.UserMapper.selectById : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE user_id=? +2025-04-18 08:44:34.728 DEBUG 1487 --- [http-nio-9092-exec-3] c.mingchen.mapper.UserMapper.selectById : ==> Parameters: 1(Long) +2025-04-18 08:44:34.767 DEBUG 1487 --- [http-nio-9092-exec-3] c.mingchen.mapper.UserMapper.selectById : <== Total: 1 +2025-04-18 08:46:42.723 DEBUG 1487 --- [http-nio-9092-exec-5] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-18 08:46:42.724 DEBUG 1487 --- [http-nio-9092-exec-5] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-18 08:46:42.769 DEBUG 1487 --- [http-nio-9092-exec-5] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-18 08:46:42.770 DEBUG 1487 --- [http-nio-9092-exec-5] c.m.m.C.getAllCategoriesWithLaws : ==> Preparing: SELECT c.category_id, c.name, c.description, l.law_id, l.category_id AS law_category_id, l.title, l.summary, l.content, l.effective_date, l.reference_url FROM categories c LEFT JOIN laws l ON c.category_id = l.category_id ORDER BY c.category_id, l.law_id +2025-04-18 08:46:42.770 DEBUG 1487 --- [http-nio-9092-exec-5] c.m.m.C.getAllCategoriesWithLaws : ==> Parameters: +2025-04-18 08:46:42.821 DEBUG 1487 --- [http-nio-9092-exec-5] c.m.m.C.getAllCategoriesWithLaws : <== Total: 6 +2025-04-18 08:47:57.778 DEBUG 1487 --- [http-nio-9092-exec-7] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-18 08:47:57.780 DEBUG 1487 --- [http-nio-9092-exec-7] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-18 08:47:57.819 DEBUG 1487 --- [http-nio-9092-exec-7] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-18 08:47:57.825 DEBUG 1487 --- [http-nio-9092-exec-7] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM learning_resources +2025-04-18 08:47:57.826 DEBUG 1487 --- [http-nio-9092-exec-7] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-18 08:47:57.870 DEBUG 1487 --- [http-nio-9092-exec-7] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-18 08:47:57.871 DEBUG 1487 --- [http-nio-9092-exec-7] c.m.m.L.selectList : ==> Preparing: SELECT resource_id,title,type,url,duration,description FROM learning_resources LIMIT ? +2025-04-18 08:47:57.872 DEBUG 1487 --- [http-nio-9092-exec-7] c.m.m.L.selectList : ==> Parameters: 2(Integer) +2025-04-18 08:47:57.908 DEBUG 1487 --- [http-nio-9092-exec-7] c.m.m.L.selectList : <== Total: 2 +2025-04-18 08:47:58.973 DEBUG 1487 --- [http-nio-9092-exec-8] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-18 08:47:58.974 DEBUG 1487 --- [http-nio-9092-exec-8] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-18 08:47:59.008 DEBUG 1487 --- [http-nio-9092-exec-8] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-18 08:47:59.016 DEBUG 1487 --- [http-nio-9092-exec-8] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM legalAidResources +2025-04-18 08:47:59.017 DEBUG 1487 --- [http-nio-9092-exec-8] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-18 08:47:59.059 DEBUG 1487 --- [http-nio-9092-exec-8] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-18 08:47:59.059 DEBUG 1487 --- [http-nio-9092-exec-8] c.m.m.L.selectList : ==> Preparing: SELECT aid_id,name,type,phone_number,email,avatar,address,website_url,is_emergency,description FROM legalAidResources LIMIT ? +2025-04-18 08:47:59.060 DEBUG 1487 --- [http-nio-9092-exec-8] c.m.m.L.selectList : ==> Parameters: 6(Integer) +2025-04-18 08:47:59.103 DEBUG 1487 --- [http-nio-9092-exec-8] c.m.m.L.selectList : <== Total: 6 +2025-04-18 08:47:59.718 DEBUG 1487 --- [http-nio-9092-exec-9] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-18 08:47:59.719 DEBUG 1487 --- [http-nio-9092-exec-9] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-18 08:47:59.759 DEBUG 1487 --- [http-nio-9092-exec-9] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-18 08:47:59.760 DEBUG 1487 --- [http-nio-9092-exec-9] c.mingchen.mapper.UserMapper.selectById : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE user_id=? +2025-04-18 08:47:59.761 DEBUG 1487 --- [http-nio-9092-exec-9] c.mingchen.mapper.UserMapper.selectById : ==> Parameters: 1(Long) +2025-04-18 08:47:59.811 DEBUG 1487 --- [http-nio-9092-exec-9] c.mingchen.mapper.UserMapper.selectById : <== Total: 1 +2025-04-18 08:48:00.818 DEBUG 1487 --- [http-nio-9092-exec-10] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-18 08:48:00.819 DEBUG 1487 --- [http-nio-9092-exec-10] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-18 08:48:00.851 DEBUG 1487 --- [http-nio-9092-exec-10] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-18 08:48:00.857 DEBUG 1487 --- [http-nio-9092-exec-10] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM learning_resources +2025-04-18 08:48:00.857 DEBUG 1487 --- [http-nio-9092-exec-10] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-18 08:48:00.889 DEBUG 1487 --- [http-nio-9092-exec-10] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-18 08:48:00.889 DEBUG 1487 --- [http-nio-9092-exec-10] c.m.m.L.selectList : ==> Preparing: SELECT resource_id,title,type,url,duration,description FROM learning_resources LIMIT ? +2025-04-18 08:48:00.890 DEBUG 1487 --- [http-nio-9092-exec-10] c.m.m.L.selectList : ==> Parameters: 2(Integer) +2025-04-18 08:48:00.929 DEBUG 1487 --- [http-nio-9092-exec-10] c.m.m.L.selectList : <== Total: 2 +2025-04-18 08:53:13.288 DEBUG 1487 --- [http-nio-9092-exec-2] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-18 08:53:13.289 DEBUG 1487 --- [http-nio-9092-exec-2] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-18 08:53:13.324 DEBUG 1487 --- [http-nio-9092-exec-2] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-18 08:53:13.325 DEBUG 1487 --- [http-nio-9092-exec-2] c.m.m.C.getAllCategoriesWithLaws : ==> Preparing: SELECT c.category_id, c.name, c.description, l.law_id, l.category_id AS law_category_id, l.title, l.summary, l.content, l.effective_date, l.reference_url FROM categories c LEFT JOIN laws l ON c.category_id = l.category_id ORDER BY c.category_id, l.law_id +2025-04-18 08:53:13.325 DEBUG 1487 --- [http-nio-9092-exec-2] c.m.m.C.getAllCategoriesWithLaws : ==> Parameters: +2025-04-18 08:53:13.377 DEBUG 1487 --- [http-nio-9092-exec-2] c.m.m.C.getAllCategoriesWithLaws : <== Total: 6 +2025-04-18 08:53:18.559 DEBUG 1487 --- [http-nio-9092-exec-3] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-18 08:53:18.560 DEBUG 1487 --- [http-nio-9092-exec-3] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-18 08:53:18.594 DEBUG 1487 --- [http-nio-9092-exec-3] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-18 08:53:18.602 DEBUG 1487 --- [http-nio-9092-exec-3] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM learning_resources +2025-04-18 08:53:18.603 DEBUG 1487 --- [http-nio-9092-exec-3] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-18 08:53:18.636 DEBUG 1487 --- [http-nio-9092-exec-3] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-18 08:53:18.637 DEBUG 1487 --- [http-nio-9092-exec-3] c.m.m.L.selectList : ==> Preparing: SELECT resource_id,title,type,url,duration,description FROM learning_resources LIMIT ? +2025-04-18 08:53:18.637 DEBUG 1487 --- [http-nio-9092-exec-3] c.m.m.L.selectList : ==> Parameters: 2(Integer) +2025-04-18 08:53:18.674 DEBUG 1487 --- [http-nio-9092-exec-3] c.m.m.L.selectList : <== Total: 2 +2025-04-18 08:58:54.390 DEBUG 1487 --- [http-nio-9092-exec-5] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-18 08:58:54.391 DEBUG 1487 --- [http-nio-9092-exec-5] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-18 08:58:54.433 DEBUG 1487 --- [http-nio-9092-exec-5] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-18 08:58:54.434 DEBUG 1487 --- [http-nio-9092-exec-5] c.m.m.C.getAllCategoriesWithLaws : ==> Preparing: SELECT c.category_id, c.name, c.description, l.law_id, l.category_id AS law_category_id, l.title, l.summary, l.content, l.effective_date, l.reference_url FROM categories c LEFT JOIN laws l ON c.category_id = l.category_id ORDER BY c.category_id, l.law_id +2025-04-18 08:58:54.435 DEBUG 1487 --- [http-nio-9092-exec-5] c.m.m.C.getAllCategoriesWithLaws : ==> Parameters: +2025-04-18 08:58:54.479 DEBUG 1487 --- [http-nio-9092-exec-5] c.m.m.C.getAllCategoriesWithLaws : <== Total: 6 +2025-04-18 08:58:58.913 DEBUG 1487 --- [http-nio-9092-exec-6] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-18 08:58:58.913 DEBUG 1487 --- [http-nio-9092-exec-6] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-18 08:58:58.951 DEBUG 1487 --- [http-nio-9092-exec-6] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-18 08:58:58.952 DEBUG 1487 --- [http-nio-9092-exec-6] c.m.m.C.getAllCategoriesWithLaws : ==> Preparing: SELECT c.category_id, c.name, c.description, l.law_id, l.category_id AS law_category_id, l.title, l.summary, l.content, l.effective_date, l.reference_url FROM categories c LEFT JOIN laws l ON c.category_id = l.category_id ORDER BY c.category_id, l.law_id +2025-04-18 08:58:58.952 DEBUG 1487 --- [http-nio-9092-exec-6] c.m.m.C.getAllCategoriesWithLaws : ==> Parameters: +2025-04-18 08:58:58.999 DEBUG 1487 --- [http-nio-9092-exec-6] c.m.m.C.getAllCategoriesWithLaws : <== Total: 6 +2025-04-18 08:59:12.297 DEBUG 1487 --- [http-nio-9092-exec-7] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-18 08:59:12.297 DEBUG 1487 --- [http-nio-9092-exec-7] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-18 08:59:12.338 DEBUG 1487 --- [http-nio-9092-exec-7] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-18 08:59:12.339 DEBUG 1487 --- [http-nio-9092-exec-7] c.m.m.C.getAllCategoriesWithLaws : ==> Preparing: SELECT c.category_id, c.name, c.description, l.law_id, l.category_id AS law_category_id, l.title, l.summary, l.content, l.effective_date, l.reference_url FROM categories c LEFT JOIN laws l ON c.category_id = l.category_id ORDER BY c.category_id, l.law_id +2025-04-18 08:59:12.339 DEBUG 1487 --- [http-nio-9092-exec-7] c.m.m.C.getAllCategoriesWithLaws : ==> Parameters: +2025-04-18 08:59:12.389 DEBUG 1487 --- [http-nio-9092-exec-7] c.m.m.C.getAllCategoriesWithLaws : <== Total: 6 +2025-04-18 08:59:19.108 DEBUG 1487 --- [http-nio-9092-exec-8] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-18 08:59:19.109 DEBUG 1487 --- [http-nio-9092-exec-8] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-18 08:59:19.138 DEBUG 1487 --- [http-nio-9092-exec-8] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-18 08:59:19.139 DEBUG 1487 --- [http-nio-9092-exec-8] c.m.m.C.getAllCategoriesWithLaws : ==> Preparing: SELECT c.category_id, c.name, c.description, l.law_id, l.category_id AS law_category_id, l.title, l.summary, l.content, l.effective_date, l.reference_url FROM categories c LEFT JOIN laws l ON c.category_id = l.category_id ORDER BY c.category_id, l.law_id +2025-04-18 08:59:19.139 DEBUG 1487 --- [http-nio-9092-exec-8] c.m.m.C.getAllCategoriesWithLaws : ==> Parameters: +2025-04-18 08:59:19.189 DEBUG 1487 --- [http-nio-9092-exec-8] c.m.m.C.getAllCategoriesWithLaws : <== Total: 6 +2025-04-18 08:59:25.267 DEBUG 1487 --- [http-nio-9092-exec-9] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-18 08:59:25.267 DEBUG 1487 --- [http-nio-9092-exec-9] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-18 08:59:25.303 DEBUG 1487 --- [http-nio-9092-exec-9] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-18 08:59:25.304 DEBUG 1487 --- [http-nio-9092-exec-9] c.m.m.C.getAllCategoriesWithLaws : ==> Preparing: SELECT c.category_id, c.name, c.description, l.law_id, l.category_id AS law_category_id, l.title, l.summary, l.content, l.effective_date, l.reference_url FROM categories c LEFT JOIN laws l ON c.category_id = l.category_id ORDER BY c.category_id, l.law_id +2025-04-18 08:59:25.304 DEBUG 1487 --- [http-nio-9092-exec-9] c.m.m.C.getAllCategoriesWithLaws : ==> Parameters: +2025-04-18 08:59:25.348 DEBUG 1487 --- [http-nio-9092-exec-9] c.m.m.C.getAllCategoriesWithLaws : <== Total: 6 +2025-04-18 09:00:36.283 DEBUG 1487 --- [http-nio-9092-exec-1] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-18 09:00:36.283 DEBUG 1487 --- [http-nio-9092-exec-1] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-18 09:00:36.322 DEBUG 1487 --- [http-nio-9092-exec-1] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-18 09:00:36.322 DEBUG 1487 --- [http-nio-9092-exec-1] c.m.m.C.getAllCategoriesWithLaws : ==> Preparing: SELECT c.category_id, c.name, c.description, l.law_id, l.category_id AS law_category_id, l.title, l.summary, l.content, l.effective_date, l.reference_url FROM categories c LEFT JOIN laws l ON c.category_id = l.category_id ORDER BY c.category_id, l.law_id +2025-04-18 09:00:36.322 DEBUG 1487 --- [http-nio-9092-exec-1] c.m.m.C.getAllCategoriesWithLaws : ==> Parameters: +2025-04-18 09:00:36.378 DEBUG 1487 --- [http-nio-9092-exec-1] c.m.m.C.getAllCategoriesWithLaws : <== Total: 6 +2025-04-18 09:01:06.213 DEBUG 1487 --- [http-nio-9092-exec-2] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-18 09:01:06.214 DEBUG 1487 --- [http-nio-9092-exec-2] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-18 09:01:06.258 DEBUG 1487 --- [http-nio-9092-exec-2] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-18 09:01:06.259 DEBUG 1487 --- [http-nio-9092-exec-2] c.m.m.C.getAllCategoriesWithLaws : ==> Preparing: SELECT c.category_id, c.name, c.description, l.law_id, l.category_id AS law_category_id, l.title, l.summary, l.content, l.effective_date, l.reference_url FROM categories c LEFT JOIN laws l ON c.category_id = l.category_id ORDER BY c.category_id, l.law_id +2025-04-18 09:01:06.259 DEBUG 1487 --- [http-nio-9092-exec-2] c.m.m.C.getAllCategoriesWithLaws : ==> Parameters: +2025-04-18 09:01:06.311 DEBUG 1487 --- [http-nio-9092-exec-2] c.m.m.C.getAllCategoriesWithLaws : <== Total: 6 +2025-04-18 09:01:44.998 DEBUG 1487 --- [http-nio-9092-exec-3] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-18 09:01:44.999 DEBUG 1487 --- [http-nio-9092-exec-3] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-18 09:01:45.035 DEBUG 1487 --- [http-nio-9092-exec-3] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-18 09:01:45.035 DEBUG 1487 --- [http-nio-9092-exec-3] c.m.m.C.getAllCategoriesWithLaws : ==> Preparing: SELECT c.category_id, c.name, c.description, l.law_id, l.category_id AS law_category_id, l.title, l.summary, l.content, l.effective_date, l.reference_url FROM categories c LEFT JOIN laws l ON c.category_id = l.category_id ORDER BY c.category_id, l.law_id +2025-04-18 09:01:45.036 DEBUG 1487 --- [http-nio-9092-exec-3] c.m.m.C.getAllCategoriesWithLaws : ==> Parameters: +2025-04-18 09:01:45.090 DEBUG 1487 --- [http-nio-9092-exec-3] c.m.m.C.getAllCategoriesWithLaws : <== Total: 6 +2025-04-18 09:02:33.801 DEBUG 1487 --- [http-nio-9092-exec-4] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-18 09:02:33.802 DEBUG 1487 --- [http-nio-9092-exec-4] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-18 09:02:33.837 DEBUG 1487 --- [http-nio-9092-exec-4] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-18 09:02:33.839 DEBUG 1487 --- [http-nio-9092-exec-4] c.m.m.C.getAllCategoriesWithLaws : ==> Preparing: SELECT c.category_id, c.name, c.description, l.law_id, l.category_id AS law_category_id, l.title, l.summary, l.content, l.effective_date, l.reference_url FROM categories c LEFT JOIN laws l ON c.category_id = l.category_id ORDER BY c.category_id, l.law_id +2025-04-18 09:02:33.839 DEBUG 1487 --- [http-nio-9092-exec-4] c.m.m.C.getAllCategoriesWithLaws : ==> Parameters: +2025-04-18 09:02:33.895 DEBUG 1487 --- [http-nio-9092-exec-4] c.m.m.C.getAllCategoriesWithLaws : <== Total: 6 +2025-04-18 09:02:34.477 DEBUG 1487 --- [http-nio-9092-exec-5] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-18 09:02:34.478 DEBUG 1487 --- [http-nio-9092-exec-5] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-18 09:02:34.515 DEBUG 1487 --- [http-nio-9092-exec-5] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-18 09:02:34.516 DEBUG 1487 --- [http-nio-9092-exec-5] c.m.m.C.getAllCategoriesWithLaws : ==> Preparing: SELECT c.category_id, c.name, c.description, l.law_id, l.category_id AS law_category_id, l.title, l.summary, l.content, l.effective_date, l.reference_url FROM categories c LEFT JOIN laws l ON c.category_id = l.category_id ORDER BY c.category_id, l.law_id +2025-04-18 09:02:34.517 DEBUG 1487 --- [http-nio-9092-exec-5] c.m.m.C.getAllCategoriesWithLaws : ==> Parameters: +2025-04-18 09:02:34.568 DEBUG 1487 --- [http-nio-9092-exec-5] c.m.m.C.getAllCategoriesWithLaws : <== Total: 6 +2025-04-18 09:02:34.855 DEBUG 1487 --- [http-nio-9092-exec-6] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-18 09:02:34.855 DEBUG 1487 --- [http-nio-9092-exec-6] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-18 09:02:34.917 DEBUG 1487 --- [http-nio-9092-exec-6] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-18 09:02:34.918 DEBUG 1487 --- [http-nio-9092-exec-6] c.m.m.C.getAllCategoriesWithLaws : ==> Preparing: SELECT c.category_id, c.name, c.description, l.law_id, l.category_id AS law_category_id, l.title, l.summary, l.content, l.effective_date, l.reference_url FROM categories c LEFT JOIN laws l ON c.category_id = l.category_id ORDER BY c.category_id, l.law_id +2025-04-18 09:02:34.919 DEBUG 1487 --- [http-nio-9092-exec-6] c.m.m.C.getAllCategoriesWithLaws : ==> Parameters: +2025-04-18 09:02:34.961 DEBUG 1487 --- [http-nio-9092-exec-6] c.m.m.C.getAllCategoriesWithLaws : <== Total: 6 +2025-04-18 09:02:44.118 DEBUG 1487 --- [http-nio-9092-exec-7] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-18 09:02:44.118 DEBUG 1487 --- [http-nio-9092-exec-7] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-18 09:02:44.156 DEBUG 1487 --- [http-nio-9092-exec-7] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-18 09:02:44.157 DEBUG 1487 --- [http-nio-9092-exec-7] c.m.m.C.getAllCategoriesWithLaws : ==> Preparing: SELECT c.category_id, c.name, c.description, l.law_id, l.category_id AS law_category_id, l.title, l.summary, l.content, l.effective_date, l.reference_url FROM categories c LEFT JOIN laws l ON c.category_id = l.category_id ORDER BY c.category_id, l.law_id +2025-04-18 09:02:44.157 DEBUG 1487 --- [http-nio-9092-exec-7] c.m.m.C.getAllCategoriesWithLaws : ==> Parameters: +2025-04-18 09:02:44.213 DEBUG 1487 --- [http-nio-9092-exec-7] c.m.m.C.getAllCategoriesWithLaws : <== Total: 6 +2025-04-18 09:03:28.591 DEBUG 1487 --- [http-nio-9092-exec-8] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-18 09:03:28.591 DEBUG 1487 --- [http-nio-9092-exec-8] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-18 09:03:28.643 DEBUG 1487 --- [http-nio-9092-exec-8] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-18 09:03:28.644 DEBUG 1487 --- [http-nio-9092-exec-8] c.m.m.C.getAllCategoriesWithLaws : ==> Preparing: SELECT c.category_id, c.name, c.description, l.law_id, l.category_id AS law_category_id, l.title, l.summary, l.content, l.effective_date, l.reference_url FROM categories c LEFT JOIN laws l ON c.category_id = l.category_id ORDER BY c.category_id, l.law_id +2025-04-18 09:03:28.644 DEBUG 1487 --- [http-nio-9092-exec-8] c.m.m.C.getAllCategoriesWithLaws : ==> Parameters: +2025-04-18 09:03:28.685 DEBUG 1487 --- [http-nio-9092-exec-8] c.m.m.C.getAllCategoriesWithLaws : <== Total: 6 +2025-04-18 09:03:54.198 DEBUG 1487 --- [http-nio-9092-exec-9] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-18 09:03:54.198 DEBUG 1487 --- [http-nio-9092-exec-9] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-18 09:03:54.239 DEBUG 1487 --- [http-nio-9092-exec-9] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-18 09:03:54.240 DEBUG 1487 --- [http-nio-9092-exec-9] c.m.m.C.getAllCategoriesWithLaws : ==> Preparing: SELECT c.category_id, c.name, c.description, l.law_id, l.category_id AS law_category_id, l.title, l.summary, l.content, l.effective_date, l.reference_url FROM categories c LEFT JOIN laws l ON c.category_id = l.category_id ORDER BY c.category_id, l.law_id +2025-04-18 09:03:54.241 DEBUG 1487 --- [http-nio-9092-exec-9] c.m.m.C.getAllCategoriesWithLaws : ==> Parameters: +2025-04-18 09:03:54.289 DEBUG 1487 --- [http-nio-9092-exec-9] c.m.m.C.getAllCategoriesWithLaws : <== Total: 6 +2025-04-18 09:04:14.566 DEBUG 1487 --- [http-nio-9092-exec-10] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-18 09:04:14.567 DEBUG 1487 --- [http-nio-9092-exec-10] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-18 09:04:14.608 DEBUG 1487 --- [http-nio-9092-exec-10] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-18 09:04:14.609 DEBUG 1487 --- [http-nio-9092-exec-10] c.m.m.C.getAllCategoriesWithLaws : ==> Preparing: SELECT c.category_id, c.name, c.description, l.law_id, l.category_id AS law_category_id, l.title, l.summary, l.content, l.effective_date, l.reference_url FROM categories c LEFT JOIN laws l ON c.category_id = l.category_id ORDER BY c.category_id, l.law_id +2025-04-18 09:04:14.609 DEBUG 1487 --- [http-nio-9092-exec-10] c.m.m.C.getAllCategoriesWithLaws : ==> Parameters: +2025-04-18 09:04:14.652 DEBUG 1487 --- [http-nio-9092-exec-10] c.m.m.C.getAllCategoriesWithLaws : <== Total: 6 +2025-04-18 09:05:02.347 DEBUG 1487 --- [http-nio-9092-exec-1] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-18 09:05:02.348 DEBUG 1487 --- [http-nio-9092-exec-1] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-18 09:05:02.386 DEBUG 1487 --- [http-nio-9092-exec-1] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-18 09:05:02.391 DEBUG 1487 --- [http-nio-9092-exec-1] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM learning_resources +2025-04-18 09:05:02.392 DEBUG 1487 --- [http-nio-9092-exec-1] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-18 09:05:02.427 DEBUG 1487 --- [http-nio-9092-exec-1] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-18 09:05:02.428 DEBUG 1487 --- [http-nio-9092-exec-1] c.m.m.L.selectList : ==> Preparing: SELECT resource_id,title,type,url,duration,description FROM learning_resources LIMIT ? +2025-04-18 09:05:02.428 DEBUG 1487 --- [http-nio-9092-exec-1] c.m.m.L.selectList : ==> Parameters: 2(Integer) +2025-04-18 09:05:02.468 DEBUG 1487 --- [http-nio-9092-exec-1] c.m.m.L.selectList : <== Total: 2 +2025-04-18 09:05:03.067 DEBUG 1487 --- [http-nio-9092-exec-2] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-18 09:05:03.068 DEBUG 1487 --- [http-nio-9092-exec-2] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-18 09:05:03.113 DEBUG 1487 --- [http-nio-9092-exec-2] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-18 09:05:03.121 DEBUG 1487 --- [http-nio-9092-exec-2] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM legalAidResources +2025-04-18 09:05:03.121 DEBUG 1487 --- [http-nio-9092-exec-2] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-18 09:05:03.167 DEBUG 1487 --- [http-nio-9092-exec-2] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-18 09:05:03.168 DEBUG 1487 --- [http-nio-9092-exec-2] c.m.m.L.selectList : ==> Preparing: SELECT aid_id,name,type,phone_number,email,avatar,address,website_url,is_emergency,description FROM legalAidResources LIMIT ? +2025-04-18 09:05:03.168 DEBUG 1487 --- [http-nio-9092-exec-2] c.m.m.L.selectList : ==> Parameters: 6(Integer) +2025-04-18 09:05:03.208 DEBUG 1487 --- [http-nio-9092-exec-2] c.m.m.L.selectList : <== Total: 6 +2025-04-18 09:05:09.668 DEBUG 1487 --- [http-nio-9092-exec-3] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-18 09:05:09.669 DEBUG 1487 --- [http-nio-9092-exec-3] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-18 09:05:09.707 DEBUG 1487 --- [http-nio-9092-exec-3] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-18 09:05:09.708 DEBUG 1487 --- [http-nio-9092-exec-3] c.mingchen.mapper.UserMapper.selectById : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE user_id=? +2025-04-18 09:05:09.709 DEBUG 1487 --- [http-nio-9092-exec-3] c.mingchen.mapper.UserMapper.selectById : ==> Parameters: 1(Long) +2025-04-18 09:05:09.748 DEBUG 1487 --- [http-nio-9092-exec-3] c.mingchen.mapper.UserMapper.selectById : <== Total: 1 +2025-04-18 09:05:11.167 DEBUG 1487 --- [http-nio-9092-exec-4] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-18 09:05:11.168 DEBUG 1487 --- [http-nio-9092-exec-4] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-18 09:05:11.207 DEBUG 1487 --- [http-nio-9092-exec-4] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-18 09:05:11.215 DEBUG 1487 --- [http-nio-9092-exec-4] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM legalAidResources +2025-04-18 09:05:11.215 DEBUG 1487 --- [http-nio-9092-exec-4] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-18 09:05:11.247 DEBUG 1487 --- [http-nio-9092-exec-4] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-18 09:05:11.248 DEBUG 1487 --- [http-nio-9092-exec-4] c.m.m.L.selectList : ==> Preparing: SELECT aid_id,name,type,phone_number,email,avatar,address,website_url,is_emergency,description FROM legalAidResources LIMIT ? +2025-04-18 09:05:11.248 DEBUG 1487 --- [http-nio-9092-exec-4] c.m.m.L.selectList : ==> Parameters: 6(Integer) +2025-04-18 09:05:11.288 DEBUG 1487 --- [http-nio-9092-exec-4] c.m.m.L.selectList : <== Total: 6 +2025-04-18 09:05:11.639 DEBUG 1487 --- [http-nio-9092-exec-5] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-18 09:05:11.639 DEBUG 1487 --- [http-nio-9092-exec-5] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-18 09:05:11.688 DEBUG 1487 --- [http-nio-9092-exec-5] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-18 09:05:11.693 DEBUG 1487 --- [http-nio-9092-exec-5] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM learning_resources +2025-04-18 09:05:11.693 DEBUG 1487 --- [http-nio-9092-exec-5] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-18 09:05:11.728 DEBUG 1487 --- [http-nio-9092-exec-5] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-18 09:05:11.729 DEBUG 1487 --- [http-nio-9092-exec-5] c.m.m.L.selectList : ==> Preparing: SELECT resource_id,title,type,url,duration,description FROM learning_resources LIMIT ? +2025-04-18 09:05:11.729 DEBUG 1487 --- [http-nio-9092-exec-5] c.m.m.L.selectList : ==> Parameters: 2(Integer) +2025-04-18 09:05:11.769 DEBUG 1487 --- [http-nio-9092-exec-5] c.m.m.L.selectList : <== Total: 2 +2025-04-18 09:05:14.406 DEBUG 1487 --- [http-nio-9092-exec-6] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-18 09:05:14.407 DEBUG 1487 --- [http-nio-9092-exec-6] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-18 09:05:14.446 DEBUG 1487 --- [http-nio-9092-exec-6] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-18 09:05:14.451 DEBUG 1487 --- [http-nio-9092-exec-6] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM legalAidResources +2025-04-18 09:05:14.451 DEBUG 1487 --- [http-nio-9092-exec-6] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-18 09:05:14.487 DEBUG 1487 --- [http-nio-9092-exec-6] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-18 09:05:14.488 DEBUG 1487 --- [http-nio-9092-exec-6] c.m.m.L.selectList : ==> Preparing: SELECT aid_id,name,type,phone_number,email,avatar,address,website_url,is_emergency,description FROM legalAidResources LIMIT ? +2025-04-18 09:05:14.488 DEBUG 1487 --- [http-nio-9092-exec-6] c.m.m.L.selectList : ==> Parameters: 6(Integer) +2025-04-18 09:05:14.533 DEBUG 1487 --- [http-nio-9092-exec-6] c.m.m.L.selectList : <== Total: 6 +2025-04-18 09:05:14.947 DEBUG 1487 --- [http-nio-9092-exec-7] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-18 09:05:14.947 DEBUG 1487 --- [http-nio-9092-exec-7] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-18 09:05:15.007 DEBUG 1487 --- [http-nio-9092-exec-7] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-18 09:05:15.008 DEBUG 1487 --- [http-nio-9092-exec-7] c.mingchen.mapper.UserMapper.selectById : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE user_id=? +2025-04-18 09:05:15.009 DEBUG 1487 --- [http-nio-9092-exec-7] c.mingchen.mapper.UserMapper.selectById : ==> Parameters: 1(Long) +2025-04-18 09:05:15.051 DEBUG 1487 --- [http-nio-9092-exec-7] c.mingchen.mapper.UserMapper.selectById : <== Total: 1 +2025-04-18 09:05:16.427 DEBUG 1487 --- [http-nio-9092-exec-8] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-18 09:05:16.428 DEBUG 1487 --- [http-nio-9092-exec-8] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-18 09:05:16.468 DEBUG 1487 --- [http-nio-9092-exec-8] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-18 09:05:16.472 DEBUG 1487 --- [http-nio-9092-exec-8] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM learning_resources +2025-04-18 09:05:16.472 DEBUG 1487 --- [http-nio-9092-exec-8] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-18 09:05:16.506 DEBUG 1487 --- [http-nio-9092-exec-8] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-18 09:05:16.506 DEBUG 1487 --- [http-nio-9092-exec-8] c.m.m.L.selectList : ==> Preparing: SELECT resource_id,title,type,url,duration,description FROM learning_resources LIMIT ? +2025-04-18 09:05:16.507 DEBUG 1487 --- [http-nio-9092-exec-8] c.m.m.L.selectList : ==> Parameters: 2(Integer) +2025-04-18 09:05:16.546 DEBUG 1487 --- [http-nio-9092-exec-8] c.m.m.L.selectList : <== Total: 2 +2025-04-18 09:05:33.348 DEBUG 1487 --- [http-nio-9092-exec-9] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-18 09:05:33.349 DEBUG 1487 --- [http-nio-9092-exec-9] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-18 09:05:33.387 DEBUG 1487 --- [http-nio-9092-exec-9] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-18 09:05:33.393 DEBUG 1487 --- [http-nio-9092-exec-9] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM learning_resources +2025-04-18 09:05:33.393 DEBUG 1487 --- [http-nio-9092-exec-9] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-18 09:05:33.428 DEBUG 1487 --- [http-nio-9092-exec-9] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-18 09:05:33.428 DEBUG 1487 --- [http-nio-9092-exec-9] c.m.m.L.selectList : ==> Preparing: SELECT resource_id,title,type,url,duration,description FROM learning_resources LIMIT ? +2025-04-18 09:05:33.429 DEBUG 1487 --- [http-nio-9092-exec-9] c.m.m.L.selectList : ==> Parameters: 2(Integer) +2025-04-18 09:05:33.467 DEBUG 1487 --- [http-nio-9092-exec-9] c.m.m.L.selectList : <== Total: 2 +2025-04-18 09:05:33.954 DEBUG 1487 --- [http-nio-9092-exec-10] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-18 09:05:33.954 DEBUG 1487 --- [http-nio-9092-exec-10] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-18 09:05:34.009 DEBUG 1487 --- [http-nio-9092-exec-10] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-18 09:05:34.016 DEBUG 1487 --- [http-nio-9092-exec-10] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM legalAidResources +2025-04-18 09:05:34.017 DEBUG 1487 --- [http-nio-9092-exec-10] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-18 09:05:34.049 DEBUG 1487 --- [http-nio-9092-exec-10] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-18 09:05:34.049 DEBUG 1487 --- [http-nio-9092-exec-10] c.m.m.L.selectList : ==> Preparing: SELECT aid_id,name,type,phone_number,email,avatar,address,website_url,is_emergency,description FROM legalAidResources LIMIT ? +2025-04-18 09:05:34.050 DEBUG 1487 --- [http-nio-9092-exec-10] c.m.m.L.selectList : ==> Parameters: 6(Integer) +2025-04-18 09:05:34.089 DEBUG 1487 --- [http-nio-9092-exec-10] c.m.m.L.selectList : <== Total: 6 +2025-04-18 09:05:34.908 DEBUG 1487 --- [http-nio-9092-exec-1] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-18 09:05:34.908 DEBUG 1487 --- [http-nio-9092-exec-1] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-18 09:05:34.948 DEBUG 1487 --- [http-nio-9092-exec-1] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-18 09:05:34.949 DEBUG 1487 --- [http-nio-9092-exec-1] c.mingchen.mapper.UserMapper.selectById : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE user_id=? +2025-04-18 09:05:34.950 DEBUG 1487 --- [http-nio-9092-exec-1] c.mingchen.mapper.UserMapper.selectById : ==> Parameters: 1(Long) +2025-04-18 09:05:34.989 DEBUG 1487 --- [http-nio-9092-exec-1] c.mingchen.mapper.UserMapper.selectById : <== Total: 1 +2025-04-18 09:05:35.386 DEBUG 1487 --- [http-nio-9092-exec-2] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-18 09:05:35.386 DEBUG 1487 --- [http-nio-9092-exec-2] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-18 09:05:35.427 DEBUG 1487 --- [http-nio-9092-exec-2] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-18 09:05:35.432 DEBUG 1487 --- [http-nio-9092-exec-2] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM legalAidResources +2025-04-18 09:05:35.432 DEBUG 1487 --- [http-nio-9092-exec-2] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-18 09:05:35.467 DEBUG 1487 --- [http-nio-9092-exec-2] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-18 09:05:35.468 DEBUG 1487 --- [http-nio-9092-exec-2] c.m.m.L.selectList : ==> Preparing: SELECT aid_id,name,type,phone_number,email,avatar,address,website_url,is_emergency,description FROM legalAidResources LIMIT ? +2025-04-18 09:05:35.469 DEBUG 1487 --- [http-nio-9092-exec-2] c.m.m.L.selectList : ==> Parameters: 6(Integer) +2025-04-18 09:05:35.508 DEBUG 1487 --- [http-nio-9092-exec-2] c.m.m.L.selectList : <== Total: 6 +2025-04-18 09:05:36.926 DEBUG 1487 --- [http-nio-9092-exec-3] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-18 09:05:36.927 DEBUG 1487 --- [http-nio-9092-exec-3] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-18 09:05:36.968 DEBUG 1487 --- [http-nio-9092-exec-3] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-18 09:05:36.971 DEBUG 1487 --- [http-nio-9092-exec-3] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM learning_resources +2025-04-18 09:05:36.971 DEBUG 1487 --- [http-nio-9092-exec-3] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-18 09:05:37.008 DEBUG 1487 --- [http-nio-9092-exec-3] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-18 09:05:37.008 DEBUG 1487 --- [http-nio-9092-exec-3] c.m.m.L.selectList : ==> Preparing: SELECT resource_id,title,type,url,duration,description FROM learning_resources LIMIT ? +2025-04-18 09:05:37.008 DEBUG 1487 --- [http-nio-9092-exec-3] c.m.m.L.selectList : ==> Parameters: 2(Integer) +2025-04-18 09:05:37.052 DEBUG 1487 --- [http-nio-9092-exec-3] c.m.m.L.selectList : <== Total: 2 +2025-04-18 09:05:39.467 DEBUG 1487 --- [http-nio-9092-exec-4] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-18 09:05:39.467 DEBUG 1487 --- [http-nio-9092-exec-4] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-18 09:05:39.507 DEBUG 1487 --- [http-nio-9092-exec-4] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-18 09:05:39.515 DEBUG 1487 --- [http-nio-9092-exec-4] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM legalAidResources +2025-04-18 09:05:39.516 DEBUG 1487 --- [http-nio-9092-exec-4] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-18 09:05:39.548 DEBUG 1487 --- [http-nio-9092-exec-4] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-18 09:05:39.548 DEBUG 1487 --- [http-nio-9092-exec-4] c.m.m.L.selectList : ==> Preparing: SELECT aid_id,name,type,phone_number,email,avatar,address,website_url,is_emergency,description FROM legalAidResources LIMIT ? +2025-04-18 09:05:39.548 DEBUG 1487 --- [http-nio-9092-exec-4] c.m.m.L.selectList : ==> Parameters: 6(Integer) +2025-04-18 09:05:39.592 DEBUG 1487 --- [http-nio-9092-exec-4] c.m.m.L.selectList : <== Total: 6 +2025-04-18 09:05:39.997 DEBUG 1487 --- [http-nio-9092-exec-5] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-18 09:05:39.997 DEBUG 1487 --- [http-nio-9092-exec-5] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-18 09:05:40.039 DEBUG 1487 --- [http-nio-9092-exec-5] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-18 09:05:40.040 DEBUG 1487 --- [http-nio-9092-exec-5] c.mingchen.mapper.UserMapper.selectById : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE user_id=? +2025-04-18 09:05:40.041 DEBUG 1487 --- [http-nio-9092-exec-5] c.mingchen.mapper.UserMapper.selectById : ==> Parameters: 1(Long) +2025-04-18 09:05:40.093 DEBUG 1487 --- [http-nio-9092-exec-5] c.mingchen.mapper.UserMapper.selectById : <== Total: 1 +2025-04-18 09:05:42.008 DEBUG 1487 --- [http-nio-9092-exec-6] c.mingchen.mapper.UserMapper.selectList : ==> Preparing: SELECT user_id,username,password,avatar,email,create_time,update_time,role,ip,address FROM user WHERE (email = ?) +2025-04-18 09:05:42.008 DEBUG 1487 --- [http-nio-9092-exec-6] c.mingchen.mapper.UserMapper.selectList : ==> Parameters: admin@gmail.com(String) +2025-04-18 09:05:42.048 DEBUG 1487 --- [http-nio-9092-exec-6] c.mingchen.mapper.UserMapper.selectList : <== Total: 1 +2025-04-18 09:05:42.054 DEBUG 1487 --- [http-nio-9092-exec-6] c.m.m.L.selectList_COUNT : ==> Preparing: SELECT count(0) FROM learning_resources +2025-04-18 09:05:42.055 DEBUG 1487 --- [http-nio-9092-exec-6] c.m.m.L.selectList_COUNT : ==> Parameters: +2025-04-18 09:05:42.088 DEBUG 1487 --- [http-nio-9092-exec-6] c.m.m.L.selectList_COUNT : <== Total: 1 +2025-04-18 09:05:42.089 DEBUG 1487 --- [http-nio-9092-exec-6] c.m.m.L.selectList : ==> Preparing: SELECT resource_id,title,type,url,duration,description FROM learning_resources LIMIT ? +2025-04-18 09:05:42.089 DEBUG 1487 --- [http-nio-9092-exec-6] c.m.m.L.selectList : ==> Parameters: 2(Integer) +2025-04-18 09:05:42.129 DEBUG 1487 --- [http-nio-9092-exec-6] c.m.m.L.selectList : <== Total: 2 +2025-04-18 09:10:47.976 INFO 1487 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED paused. +2025-04-18 09:10:47.977 INFO 1487 --- [SpringContextShutdownHook] o.s.s.quartz.SchedulerFactoryBean : Shutting down Quartz Scheduler +2025-04-18 09:10:47.977 INFO 1487 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED shutting down. +2025-04-18 09:10:47.977 INFO 1487 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED paused. +2025-04-18 09:10:47.977 INFO 1487 --- [SpringContextShutdownHook] org.quartz.core.QuartzScheduler : Scheduler quartzScheduler_$_NON_CLUSTERED shutdown complete. +2025-04-18 09:10:47.978 INFO 1487 --- [SpringContextShutdownHook] o.s.s.concurrent.ThreadPoolTaskExecutor : Shutting down ExecutorService 'applicationTaskExecutor' +2025-04-18 09:10:47.983 INFO 1487 --- [SpringContextShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown initiated... +2025-04-18 09:10:47.984 INFO 1487 --- [SpringContextShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown completed. diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..5a2c7a4 --- /dev/null +++ b/pom.xml @@ -0,0 +1,31 @@ + + + 4.0.0 + + org.example + legalAid + 1.1-SNAPSHOT + pom + + api + framework/parent + framework/common + framework/mysql + framework/redis + framework/rabbitmq + framework/mvc + framework/xxl-job + framework/es + + + + + + 11 + 11 + UTF-8 + + + \ No newline at end of file