第一阶段配置数据库、搭建springboot、配置依赖、yml文件、连接前端网站测试等遇到的最大问题就是版本不兼容jdk25太新了导致spring和mybatis plus失效当前修正之后的jdk是21springboot 3.5.13相较于mybatisplus版省去了很多crud的代码它提供了较为完整的crud代码量减少了1.entity放和数据库表一模一样的实体类2.mapper和数据库打交道负责增删改查3.service写业务逻辑登录、上传、总结等4.controller对外提供接口前端/浏览器调用5.启动类项目入口负责扫描所有包Python 侧完成 “标准化项目结构 PDF/Word/TXT 解析接口”验证文档解析功能Java 侧完成 “SpringBoot 基础工程 Python 服务调用工具 文档上传接口”实现 Java→Python 的文件上传 解析调用链路验证确保 Java 上传文档→Python 解析→Java 接收结果的全流程通为第 2 周 “AI 问答、总结” 功能铺路准备工作完成讯飞星火密钥获取、数据库表创建为后续大模型调用、数据存储做准备。参数格式不匹配是前后端 / 微服务调用最常见的错误Java 发 JSONPython 必须用Body(...)接收不能直接写question: str注解的核心作用控制反转IoC将对象的创建和管理交给 Spring 容器依赖注入DI自动注入依赖无需手动创建和传递组件扫描自动发现和注册组件减少配置生命周期管理支持初始化和销毁方法AOP 支持为横切关注点如事务、日志提供支持1.RestController用于前后端分离主要作用是接收前端请求和返回JSON数据在当前项目中前端直接拿到数据就能渲染展示不用跳页面Controller返回的是页面老项目用2.相比于Autowired (Spring)、Resourcejava注入依赖用RequiredArgsConstructor (Lombok)更干净更推荐但是要在要注入依赖的对象前面加上final这也更安全保证对象不会被篡改对于通过配置类手动注册的组件如拦截器、过滤器等使用显式构造函数时最直接和可靠的方式确保依赖能够正确传递RequiredArgsConstructor主要作用是省略手写构造方法自动生成当一个类只有一个构造方法时spring会自动走构造器注入因此能省略Autowired3.在编写代码的时候要做到解耦和划清职责controller层只负责接收前端请求和返回后端数据service层编写核心逻辑mapper层连接数据库并执行SQL语句各区域要分工明确4.实体类要对应数据库表的字段service层有接口也有接口的实现类接口只写方法名不写方法体实现类里面才是service层的核心逻辑代码这样符合java设计原则面向接口编程好处有解耦方便测试维护、方法替换实现接口不用动、规范统一5.Slf4j是Lombok提供的注解可自动生成日志对象在编译时自动为这个类生成一个名为log的日志对象可直接使用log.info()、log.error()等方法记录日志Service是spring框架提供的注解用来标识这是一个服务层组件将此类标记为Spring容器中的一个Bean使Spring能够自动扫描并管理这个类的实例符合Spring的分层架构理念Controller层、Service层、Repository层Value是spring框架提供的一个注解用于从配置文件如application.properties或application.yml中获取值并注入到类的字段中集中管理配置所有配置项集中在配置文件中便于统一管理环境隔离不同环境开发、测试、生产可以使用不同的配置文件代码简洁无需编写读取配置文件的代码Spring 会自动处理Data是Lombok提供的注解可省略getter和setter6.HttpResponse是hutool工具库提供的HTTP客户端工具类在java后端和python服务之间需要通过HTTP协议进行通信MultipartFile是spring框架提供的一个接口用于处理HTTP请求中的文件上传它封装了上传文件的信息和操作方法是spring中处理文件上传的标准方式7.在项目中没有写ComponentScan是因为在启动类那添加了SpringBootApplication注解它包含了SpringBootConfiguration、EnableAutoConfiguration、ComponentScan其中ComponentScan能扫描启动类及其子包下的spring组件包括Service、Controller、Component等等但是我在项目里连接数据库层的用的是Mapper这是mybatis提供的所有它无法被SpringBootApplication扫描所以还得写个MapperScan8.在项目中原本在controller层还有异常处理的代码没有抽离出来现在通过声明式异常处理控制器类RestControllerAdvice来进行全局异常处理新建了BusinessException类继承RuntimeException和GlobalExceptionHandler类用来统一处理异常解耦controller层RestControllerAdviceControllerAdviceResponseBody因此代码能更简洁9.要避免硬编码可以将jwt里面的secret密钥、expiration过期时间配置到yml里提高了代码的可维护性在项目上线前还需把secret替换成更安全的随机字符串10.在yml的mybatis-plus设置block-attack-enableture能防止全表更新和删除虽然项目中删除和更新几乎都是通过id等进行操作可以避免全表操作但是加了这个不会有坏处建议以后项目都加上11.对ai接口实现了异步处理Async搭配CompletableFuture可获取异步处理的结果在AsyncConfig配置类里使用spring提供的ThreadPoolTaskExecutor来自定义线程池和管理异步任务的执行项目里在调用ai时采用了异步接口但异步长时间耗时AI任务SpringSecurity会丢失登录上下文导致返回用户未登录主线程提前401最终通过开启异步、共享安全上下文、主线程等待异步结果join等解决了问题12.filter 过滤器负责 全局、安全、认证、跨域、请求入口拦截JWT、登录校验、权限、防攻击 → 用 FilterInterceptor 拦截器负责 业务、日志、接口自定义增强操作日志、接口统计、业务判断 → 用拦截器在项目中原来的jwt是自定义的拦截器由于需要securityconfig实现密码加盐所以直接把jwt也放进springsecurity而它是基于Filter设计的所以此时jwt变成filter配合security合并并且拦截器是在请求走完Filter、进入spring之后才执行只拦截Controller层接口执行时机太晚而Filter是在最前面执行的执行顺序 Filter包含Security → Interceptor → Controller写业务小功能拦截器更好、更简单写安全、认证、全局拦截过滤器更强、更合理、官方标准现在要配合 SpringSecurity 做 JWT必须用 Filter不能用拦截器关闭CSRF由于项目是前后端分离、用jwt做登录、接口供第三方调用所以要在SecurityConfig里关闭看登录方式JWT/Token→关 CSRFSession/Cookie→开 CSRF看项目类型前后端分离→关后端渲染页面→开13.使用hutool工具库替代Spring的RestTemplate实现第三方AI接口调用原生ResrTemplate需要手动创建配置类、注入bean相对冗余14.使用双层tokenaccessToken refreshTokenaccessToken只有30分钟有效期保证泄露时间短refreshToken有效期7天在这7天内用户无需再次登录保证体验配合前端自动刷新可以做到7天内用户无需再次登录双层token机制在安全性和用户体验之间找到完美平衡accessToken存储位置前端本地localStorage因为验证它时不需要查数据库或redisrefreshToken存储位置前端 redis 原因1因为要实现主动失效功能例如用户修改密码、登出、账户被锁定时需要立即失效token这样即使旧的accessToken还没过期也无法获取新的accessToken最多就30分钟泄露的时间大大降低风险 原因2防止refreshToken被重复使用refreshToken是一次性用的刷新token验证成功后立即删除旧的refreshToken并生成和存储新的refreshToken即使被泄露也只能用一次方案安全性用户体验只用一个长有效期 Token低泄露后危害大好长时间不用登录只用一个短有效期 Token高差频繁登录双层 Token高好15.当业务互相注入形成循环依赖时可以用DB静态工具方法和IService大同小异只不过要多指定一下字节码
DocMind-AI文档智能分析助手项目
发布时间:2026/7/6 15:13:43
第一阶段配置数据库、搭建springboot、配置依赖、yml文件、连接前端网站测试等遇到的最大问题就是版本不兼容jdk25太新了导致spring和mybatis plus失效当前修正之后的jdk是21springboot 3.5.13相较于mybatisplus版省去了很多crud的代码它提供了较为完整的crud代码量减少了1.entity放和数据库表一模一样的实体类2.mapper和数据库打交道负责增删改查3.service写业务逻辑登录、上传、总结等4.controller对外提供接口前端/浏览器调用5.启动类项目入口负责扫描所有包Python 侧完成 “标准化项目结构 PDF/Word/TXT 解析接口”验证文档解析功能Java 侧完成 “SpringBoot 基础工程 Python 服务调用工具 文档上传接口”实现 Java→Python 的文件上传 解析调用链路验证确保 Java 上传文档→Python 解析→Java 接收结果的全流程通为第 2 周 “AI 问答、总结” 功能铺路准备工作完成讯飞星火密钥获取、数据库表创建为后续大模型调用、数据存储做准备。参数格式不匹配是前后端 / 微服务调用最常见的错误Java 发 JSONPython 必须用Body(...)接收不能直接写question: str注解的核心作用控制反转IoC将对象的创建和管理交给 Spring 容器依赖注入DI自动注入依赖无需手动创建和传递组件扫描自动发现和注册组件减少配置生命周期管理支持初始化和销毁方法AOP 支持为横切关注点如事务、日志提供支持1.RestController用于前后端分离主要作用是接收前端请求和返回JSON数据在当前项目中前端直接拿到数据就能渲染展示不用跳页面Controller返回的是页面老项目用2.相比于Autowired (Spring)、Resourcejava注入依赖用RequiredArgsConstructor (Lombok)更干净更推荐但是要在要注入依赖的对象前面加上final这也更安全保证对象不会被篡改对于通过配置类手动注册的组件如拦截器、过滤器等使用显式构造函数时最直接和可靠的方式确保依赖能够正确传递RequiredArgsConstructor主要作用是省略手写构造方法自动生成当一个类只有一个构造方法时spring会自动走构造器注入因此能省略Autowired3.在编写代码的时候要做到解耦和划清职责controller层只负责接收前端请求和返回后端数据service层编写核心逻辑mapper层连接数据库并执行SQL语句各区域要分工明确4.实体类要对应数据库表的字段service层有接口也有接口的实现类接口只写方法名不写方法体实现类里面才是service层的核心逻辑代码这样符合java设计原则面向接口编程好处有解耦方便测试维护、方法替换实现接口不用动、规范统一5.Slf4j是Lombok提供的注解可自动生成日志对象在编译时自动为这个类生成一个名为log的日志对象可直接使用log.info()、log.error()等方法记录日志Service是spring框架提供的注解用来标识这是一个服务层组件将此类标记为Spring容器中的一个Bean使Spring能够自动扫描并管理这个类的实例符合Spring的分层架构理念Controller层、Service层、Repository层Value是spring框架提供的一个注解用于从配置文件如application.properties或application.yml中获取值并注入到类的字段中集中管理配置所有配置项集中在配置文件中便于统一管理环境隔离不同环境开发、测试、生产可以使用不同的配置文件代码简洁无需编写读取配置文件的代码Spring 会自动处理Data是Lombok提供的注解可省略getter和setter6.HttpResponse是hutool工具库提供的HTTP客户端工具类在java后端和python服务之间需要通过HTTP协议进行通信MultipartFile是spring框架提供的一个接口用于处理HTTP请求中的文件上传它封装了上传文件的信息和操作方法是spring中处理文件上传的标准方式7.在项目中没有写ComponentScan是因为在启动类那添加了SpringBootApplication注解它包含了SpringBootConfiguration、EnableAutoConfiguration、ComponentScan其中ComponentScan能扫描启动类及其子包下的spring组件包括Service、Controller、Component等等但是我在项目里连接数据库层的用的是Mapper这是mybatis提供的所有它无法被SpringBootApplication扫描所以还得写个MapperScan8.在项目中原本在controller层还有异常处理的代码没有抽离出来现在通过声明式异常处理控制器类RestControllerAdvice来进行全局异常处理新建了BusinessException类继承RuntimeException和GlobalExceptionHandler类用来统一处理异常解耦controller层RestControllerAdviceControllerAdviceResponseBody因此代码能更简洁9.要避免硬编码可以将jwt里面的secret密钥、expiration过期时间配置到yml里提高了代码的可维护性在项目上线前还需把secret替换成更安全的随机字符串10.在yml的mybatis-plus设置block-attack-enableture能防止全表更新和删除虽然项目中删除和更新几乎都是通过id等进行操作可以避免全表操作但是加了这个不会有坏处建议以后项目都加上11.对ai接口实现了异步处理Async搭配CompletableFuture可获取异步处理的结果在AsyncConfig配置类里使用spring提供的ThreadPoolTaskExecutor来自定义线程池和管理异步任务的执行项目里在调用ai时采用了异步接口但异步长时间耗时AI任务SpringSecurity会丢失登录上下文导致返回用户未登录主线程提前401最终通过开启异步、共享安全上下文、主线程等待异步结果join等解决了问题12.filter 过滤器负责 全局、安全、认证、跨域、请求入口拦截JWT、登录校验、权限、防攻击 → 用 FilterInterceptor 拦截器负责 业务、日志、接口自定义增强操作日志、接口统计、业务判断 → 用拦截器在项目中原来的jwt是自定义的拦截器由于需要securityconfig实现密码加盐所以直接把jwt也放进springsecurity而它是基于Filter设计的所以此时jwt变成filter配合security合并并且拦截器是在请求走完Filter、进入spring之后才执行只拦截Controller层接口执行时机太晚而Filter是在最前面执行的执行顺序 Filter包含Security → Interceptor → Controller写业务小功能拦截器更好、更简单写安全、认证、全局拦截过滤器更强、更合理、官方标准现在要配合 SpringSecurity 做 JWT必须用 Filter不能用拦截器关闭CSRF由于项目是前后端分离、用jwt做登录、接口供第三方调用所以要在SecurityConfig里关闭看登录方式JWT/Token→关 CSRFSession/Cookie→开 CSRF看项目类型前后端分离→关后端渲染页面→开13.使用hutool工具库替代Spring的RestTemplate实现第三方AI接口调用原生ResrTemplate需要手动创建配置类、注入bean相对冗余14.使用双层tokenaccessToken refreshTokenaccessToken只有30分钟有效期保证泄露时间短refreshToken有效期7天在这7天内用户无需再次登录保证体验配合前端自动刷新可以做到7天内用户无需再次登录双层token机制在安全性和用户体验之间找到完美平衡accessToken存储位置前端本地localStorage因为验证它时不需要查数据库或redisrefreshToken存储位置前端 redis 原因1因为要实现主动失效功能例如用户修改密码、登出、账户被锁定时需要立即失效token这样即使旧的accessToken还没过期也无法获取新的accessToken最多就30分钟泄露的时间大大降低风险 原因2防止refreshToken被重复使用refreshToken是一次性用的刷新token验证成功后立即删除旧的refreshToken并生成和存储新的refreshToken即使被泄露也只能用一次方案安全性用户体验只用一个长有效期 Token低泄露后危害大好长时间不用登录只用一个短有效期 Token高差频繁登录双层 Token高好15.当业务互相注入形成循环依赖时可以用DB静态工具方法和IService大同小异只不过要多指定一下字节码