Spring Boot 04 整合Web(上)

返回JSON数据

spring-boot-starter-web依赖默认加入了jackson-databind作为JSON处理器
创建实体类与Controller类,返回实体对象就行

默认的jackson-databind

publicclassPeople{privateString name;@JsonIgnoreprivateString gender;@JsonFormat(pattern ="yyyy-MMM")privateLocalDate birthday;}
@RestControllerpublicclassPeopleController{@GetMapping("/people")publicPeoplegetPeople(){People people =newPeople(); people.setName("张三"); people.setGender("男"); people.setBirthday(LocalDate.now());return people;}}

最终界面会打印如图数据

输出
@JsonFormat规定了birthday的输出格式
gender数据由于写了@JsonIgnore注解,因此就没有出现

Gson

一个开源的JSON解析框架,需要先除去默认的jackson-databind,再加入Gson依赖

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><exclusions><exclusion><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId></exclusion></exclusions></dependency><dependency><groupId>com.google.code.gson</groupId><artifactId>gson</artifactId></dependency>

Spring Boot中提供了Gson的自动转换类GsonHttpMessageConvertersConfiguration,因此添加完依赖后就可以直接像jackson-databind一样直接使用Gson了
如果需要对日期数据惊醒格式化,则需要自定义HttpMessageConverter:

GsonHttpMessageConvertersConfiguration中有以下源码:
@ConditionalOnMissingBean注解表示当前项目没有提供GsonHttpMessageConverter时才会使用,所以自己自定义一个即可起到替代作用

可以写一个Gson的配置类GsonConfig
此外还需要在properties中写入优先使用gson的配置信息

@ConfigurationpublicclassGsonConfig{@BeanpublicGsonHttpMessageConvertergsonHttpMessageConverter(){GsonHttpMessageConverter converter =newGsonHttpMessageConverter();GsonBuilder builder =newGsonBuilder(); builder.setDateFormat("yyyy-MMM-dd"); builder.excludeFieldsWithModifiers(Modifier.PROTECTED);Gson gson = builder.create(); converter.setGson(gson);return converter;}}
builder的第二行的作用是将修饰符为protected的字段在解析时被过滤掉

properties文件添加:

spring.http.converters.preferred-json-mapper=gson 

使用fastjson

fastjson是阿里的一个开源解析框架,解析速度十分快速
但是与前两种不同的是需要提供相应的HttpMessageConverter后才能使用

1. 引入依赖

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><exclusions><exclusion><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId></exclusion></exclusions></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.62</version></dependency>

2. 配置 HttpMessageConverter

@Configuration public classMyFastJsonConfig{@Bean public FastJsonHttpMessageConverter fastJsonHttpMessageConverter(){ FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter(); FastJsonConfig config = new FastJsonConfig(); config.setDateFormat("yyyy-MM"); config.setCharset(StandardCharsets.UTF_16); config.setSerializerFeatures( SerializerFeature.WriteClassName, SerializerFeature.WriteMapNullValue, SerializerFeature.WriteNullListAsEmpty, SerializerFeature.WriteNullStringAsEmpty, SerializerFeature.WriteNullNumberAsZero, SerializerFeature.WriteNullBooleanAsFalse ); converter.setFastJsonConfig(config);return converter;}}
setSerializerFeatures完成了JSON解析过程中的一些细节WriteClassName =>写入类的名称,输出时会显示类的名称
“@type”:“fm.douban.chapter03.model.People”
WriteNullListAsEmpty =>当对象字段类型为集合且值为null时,将其序列化为空数组
WriteMapNullValue => 用于控制Map或者JavaBean中对象的值为null时的行为,因为FastJSON解析时默认会忽略值为null的字段,并不会打印它们
剩余的便是对null值情况的处理,例如null值转为0,false等
实测了一下,如果不使用UTF_16编码,直接使用UTF_8会显示中文乱码,需要加上额外的响应编码配置
在properties中写入 spring.servlet.encoding.force-response=true即可

静态资源过滤

什么是静态资源过滤

静态资源过滤是指在Web应用中,对静态资源文件(如CSS、JS、图片、HTML等)的请求进行特殊处理,不让这些请求经过某些过滤器或拦截器。

为什么需要静态资源过滤?

  1. 性能考虑
    • 静态资源不需要业务逻辑处理
    • 避免不必要的过滤器链执行
    • 提高响应速度
  2. 功能需求
    • 登录验证过滤器不应该拦截CSS/JS文件
    • 权限检查过滤器通常不需要处理图片资源
    • 日志记录过滤器可能不需要记录静态资源访问

默认策略

Spring Boot 中对静态资源过滤提供了自动化配置,可以简化静态资源过滤配置。

Spring Boot中对于Spring MVC 地自动化配置都在WebMvcAutoConfiguration类中

在WebMvcAutoConfiguration类地一个静态内部类WebMvcAutoConfigurationAdapter中实现了WebMvcConfigurer接口(还有ServletContextAware接口),其中包含一个方法addResourcehandlers用来配置静态资源过滤

WebProperties里有以下内容:

WebMvcAutoConfiguration类的addResourceHandler的主要内容:

publicvoidaddResourceHandlers(ResourceHandlerRegistry registry){if(!this.resourceProperties.isAddMappings()){ logger.debug("Default resource handling disabled");}else{this.addResourceHandler(registry,this.mvcProperties.getWebjarsPathPattern(),"classpath:/META-INF/resources/webjars/");this.addResourceHandler(registry,this.mvcProperties.getStaticPathPattern(),(Consumer)((registration)->{ registration.addResourceLocations(this.resourceProperties.getStaticLocations());if(this.servletContext !=null){ServletContextResource resource =newServletContextResource(this.servletContext,"/"); registration.addResourceLocations(newResource[]{resource});}}));}}
下文还有两个addResourceHandler的方法重载,用于最终添加路径的实现
可以从源码中看出静态资源位置的优先级:META-INF\resourcesresourcesstaticpublic

当访问同名文件时将按优先级从上到下去检索访问

自定义策略

1. 在配置文件自定义

spring.mvc.static-path-pattern=/static/** spring.resources.static-locations=classpath:/static 

第一行指定哪些url请求应该被映射到静态资源处理器
第二行为静态资源位置,静态资源位置也可以添加多个,用逗号分开即可

2. Java编码定义

实现WebMvcConfigurer接口的addResourceHandlers方法即可

@ConfigurationpublicclassMyWebMvcConfigimplementsWebMvcConfigurer{@OverridepublicvoidaddResourceHandlers(ResourceHandlerRegistry registry){ registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/"); registry.addResourceHandler("/resources/**").addResourceLocations("classpath:/resources/");}}
addResourceHandler定义映射访问的url路径
addResourceLocations定义静态资源的位置

Read more

用 Vue 3 重构 Dify 聊天前端(上篇):项目搭建与基础架构

用 Vue 3 重构 Dify 聊天前端(上篇):项目搭建与基础架构

本系列教程将带你从零开始,用 Vue 3 + TypeScript 复刻一个类似 Dify 的 AI 聊天前端。上篇聚焦项目搭建、类型设计、路由认证、HTTP 封装和状态管理。 项目简介 背景 Dify 是一个开源的 LLM 应用开发平台,提供了对话式 AI 的后端服务。在实际项目中,我们往往需要自建前端来对接Dify后端 API或LLM后端服务,实现定制化的聊天界面。 本项目的目标:用 Vue 3 构建一个生产级的 AI 聊天前端,具备以下能力: * SSE 流式输出(打字机效果) * Markdown 渲染 + 代码高亮 * 用户认证 * 文件/图片上传 * 聊天会话历史管理 * 工作流执行可视化 * Agent 思考过程展示 * 移动端响应式适配

零成本搭建飞书机器人:手把手教你用Webhook实现高效消息推送

1. 为什么你需要一个飞书机器人? 在日常工作中,我们经常需要处理各种通知需求。比如系统报警、任务提醒、审批结果通知等等。传统的解决方案包括短信、邮件或者第三方推送平台,但这些方式要么成本高,要么实时性差。飞书机器人提供了一种零成本、高效率的替代方案。 我去年负责的一个ERP系统升级项目就遇到了这个问题。当时我们需要在关键业务流程节点给不同部门的同事发送实时通知。如果使用短信,按照每天200条计算,一个月就要花费上千元。后来我们改用飞书机器人,不仅完全免费,还能实现更丰富的消息格式和精准的@提醒功能。 飞书机器人本质上是一个自动化程序,它通过Webhook技术接收外部系统的消息,并转发到指定的飞书群聊中。这种机制特别适合企业内部系统与飞书之间的集成,比如: * 运维报警通知 * 审批流程提醒 * 业务系统状态更新 * 日报/周报自动推送 * 数据监控预警 2. 5分钟快速创建你的第一个机器人 创建飞书机器人非常简单,不需要任何开发经验。下面我以电脑端操作为例,手把手带你完成整个过程。 首先打开飞书客户端,进入你想要添加机器人的群聊。点击右上角的"..."菜单,

前后端分离Web教师个人成果管理系统系统|SpringBoot+Vue+MyBatis+MySQL完整源码+部署教程

前后端分离Web教师个人成果管理系统系统|SpringBoot+Vue+MyBatis+MySQL完整源码+部署教程

摘要 随着教育信息化的快速发展,教师个人成果管理逐渐成为高校和科研机构的重要需求。传统的手工记录和文件管理方式效率低下,难以满足教师成果的动态更新和高效查询需求。尤其在科研成果、教学成果、学术论文等多维度数据的管理上,缺乏统一的平台导致数据分散、统计困难。因此,开发一套高效、安全、易用的教师个人成果管理系统具有重要的现实意义。该系统能够实现教师成果的集中管理、分类展示和快速检索,提升管理效率,同时为学校管理层提供数据支持,辅助决策分析。关键词:教师成果管理、信息化、动态更新、数据统计、决策支持。 本系统采用前后端分离架构,前端基于Vue.js框架实现响应式界面,后端使用SpringBoot提供RESTful API接口,数据库采用MySQL存储数据,并通过MyBatis实现数据持久化操作。系统功能模块包括用户权限管理、成果分类管理(如论文、项目、获奖等)、数据导入导出、多条件查询及可视化统计等。前端通过Axios与后端交互,结合Element UI组件库优化用户体验;后端采用JWT进行身份验证,确保系统安全性。系统支持教师个人成果的增删改查操作,同时提供管理员后台进行数据审核与统计

后端代码不用写了?前端操作数据库?一文精通Supabase,实战教程+本地部署

后端代码不用写了?前端操作数据库?一文精通Supabase,实战教程+本地部署

视频版:https://www.bilibili.com/video/BV1ZJsBznEt3 2025年最火的后端开源项目那必须是Supabase。Supabase是一个开源的后端级服务框架,在强大的PostgreSQL数据库的基础上,封装了用户认证、文件存储、可视化的运维面板等功能,为开发者提供了一整套开箱即用的后端基础设施。Supabase在Github上面有恐怖的9万star,这已经是整个Github上面最顶级的开源项目之一了。 总的来说,Supabase为开发者提供了三大部分的能力:后端、前端与免费的云服务。Supabase在后端提供数据库、文件存储、边缘函数、用户鉴权等各种基础设施。在前端方面,Supabase提供客户端SDK,可以将任何一个前端框架,比如React, Vue,甚至手机APP,用几行代码就可以轻松接入后端。 Supabase是一个完全开源免费的项目,我们可以使用源代码或者docker镜像,自己部署一个Supabase的完整实例。如果懒得自己部署,Supabase的官方还提供一个云服务的版本,我们只需要注册一个账户,就能立即获得一个免费的Supabase