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

Stable Diffusion 3.5 FP8镜像是否支持Mac M系列芯片?Rosetta转译实测

Stable Diffusion 3.5 FP8镜像是否支持Mac M系列芯片?Rosetta转译实测 在AI绘画圈里,Stable Diffusion 3.5的发布就像一场“视觉地震”💥——提示词理解更准、排版逻辑更强、细节还原更真,几乎把文生图模型拉到了新的天花板。但问题也来了:这么猛的模型,动不动就要16GB显存起步,普通用户哪扛得住? 于是,FP8量化版镜像(stable-diffusion-3.5-fp8) 横空出世,直接把模型体积和内存占用砍掉近半,堪称“轻量化救星”✨。可问题是:它能不能跑在我们手里的MacBook上?尤其是那些M1/M2/M3芯片的设备? 毕竟,Apple Silicon虽然性能强、能效高,但它是ARM架构啊!而绝大多数AI工具链都是为x86+GPU生态设计的。这就好比你买了辆特斯拉,结果发现充电口是国标,而家里装的是欧标插座⚡️——得靠“转接头”才行。 这个“转接头”,就是

夸克网盘免费资源电子书籍安卓软件经典游戏音乐歌曲精品教程AI绘画学习资料合集

夸克网盘免费资源电子书籍安卓软件经典游戏音乐歌曲精品教程AI绘画学习资料合集

一、夸克网盘免费资源说明 夸克网盘免费资源,来自全网整理二次精选,涵盖了几乎所有资源类型,网盘资源目录的分享链接,仅限一级目录和二级目录,一级目录是网盘资源的根目录,包括电子书籍、软件资源、游戏资源、视频资源、音乐音频、美食技术和学习资料等,二级目录是一级目录的子目录,均为资源专题形式,比如,Kindle原版书籍合集、U盘车载音乐歌曲、DeepSeek全套资源、全网专业摄影书籍、TikTok全球解锁版本、IOS巨魔专用资源、TED演讲视频合集、剪映教学全套资源、全网热门漫画精选,等等,相信其中会有你所需要的。 特别说明: 1、夸克网盘与百度网盘不同,不仅支持查看分享链接的资源大小,而且支持在分享链接页面里搜索资源,可以查询其中是否有你所需要的。 2、夸克官方一直都有福利活动,新用户可以免费领取1TB空间,具体操作方法请查看文本文件(在分享链接里)。 3、一级目录《全网精选2000T优质资料》,提供了很有价值的海量夸克资源,分享链接存放在电子表格里,整个目录大小只有9.7M,建议转存收藏。 二、夸克网盘一级目录资源 电子书籍+

AI编程工具深度对比:Cursor、Copilot、Trae与Claude Code,2025年开发者该如何选择?

2025年,AI编程助手已从新奇技术演变为生产力核心,但面对众多选择,开发者如何才能找到最适合自己的智能编程伙伴? 一、四大AI编程工具的核心定位与市场格局 2025年的AI编程工具市场已经形成了明显的分层格局。根据最新的开发者使用数据,这些工具不再仅仅是代码补全助手,而是朝着专业化、场景化方向发展。

PNP机器人学习——剖析LeRobot框架的架构、支持的策略、仿真平台和硬件、数据采集和训练过程,以及数据格式,帮助读者快速入门

PNP机器人学习——剖析LeRobot框架的架构、支持的策略、仿真平台和硬件、数据采集和训练过程,以及数据格式,帮助读者快速入门 张旭 PnP机器人 2025年11月12日 10:30 加拿大 00 引言 01 LeRobot框架架构 1.1 框架概述 LeRobot是一个专注于实际机器人应用的机器人学习框架,它提供了一系列预训练模型、数据集和工具,特别关注模仿学习和强化学习方法。框架的目标是降低机器人技术的入门门槛,使研究人员和开发者能够更容易地开发和部署机器人应用。 (README.md:55-59) 1.2 系统架构 LeRobot的系统架构由几个相互连接的子系统组成,这些子系统协同工作,支持机器人学习。核心基础设施支持机器人学习算法的策略系统、训练数据的数据集管理、模拟的环境接口以及物理硬件交互的机器人控制。示例目录展示了这些系统如何一起使用。 lerobot系统架构 1.3 代码架构 LeRobot的代码结构清晰,便于开发者理解和扩展: * . ├── examples             # 示例和教程,从这里开始学习LeRo