Web 定制
Spring Boot 的 MVC 自动配置开箱即用,但业务总有定制需求:改 JSON 序列化格式、加参数解析器、注册类型转换器等。本章讲定制的总入口 WebMvcConfigurer 与自定义序列化器的两种写法。
定制入口:实现 WebMvcConfigurer
@Configuration
public class MyWebConfig implements WebMvcConfigurer {
// 按需覆盖方法,例如:
@Override
public void addInterceptors(InterceptorRegistry registry) {
// 见 12 章
}
@Override
public void addCorsMappings(CorsRegistry registry) {
// 见 13 章
}
}
关键约定:只实现 WebMvcConfigurer,不要继承 WebMvcConfigurationSupport 或加 @EnableWebMvc。后两者会关闭 Spring Boot 对 MVC 的全部自动配置,除非要完全接管整个 MVC 层(此时以官方文档为准)。
其他常用定制点:addFormatters(注册 Formatter/Converter)、addArgumentResolvers(参数解析器)、extendMessageConverters(追加消息转换器)。
默认的 JSON 序列化
spring-boot-starter-web 内置 Jackson 作为默认 JSON 方案。Spring Boot 已自动注册 JavaTimeModule 并默认把 LocalDateTime 等时间类型输出为 ISO-8601 字符串(而非时间戳)。
方式一:ObjectMapper 定制器(全局)
@Bean
public Jackson2ObjectMapperBuilderCustomizer jacksonCustomizer() {
DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
return builder -> {
builder.simpleDateFormat("yyyy-MM-dd HH:mm:ss");
builder.serializers(new LocalDateTimeSerializer(fmt));
builder.deserializers(new LocalDateTimeDeserializer(fmt));
};
}
把该 Bean 放进任意 @Configuration 类即可全局生效,适合统一时间格式、空值策略等。Jackson2ObjectMapperBuilderCustomizer 是 Spring Boot 提供的扩展点,多个定制器会按顺序叠加。
方式二:@JsonComponent 注册单一类型
针对某个自定义类型,用 @JsonComponent 把它的序列化器/反序列化器注册到 Jackson:
@JsonComponent
public class PhoneJsonComponent {
public static class Serializer extends JsonSerializer<Phone> {
@Override
public void serialize(Phone value, JsonGenerator gen,
SerializerProvider serializers) throws IOException {
gen.writeString(value.getArea() + "-" + value.getNumber());
}
}
public static class Deserializer extends JsonDeserializer<Phone> {
@Override
public Phone deserialize(JsonParser p, DeserializationContext ctx) throws IOException {
String[] parts = p.getValueAsString().split("-");
return new Phone(parts[0], parts[1]);
}
}
}
@JsonComponent 是 Spring Boot 提供的注解,自动把内部静态类注册为 Jackson 模块,无需手工往 ObjectMapper 里挂。小范围格式差异也可直接用字段上的 @JsonFormat 注解,不必写序列化器。
小结
实现 WebMvcConfigurer 是 Web 层定制的总入口;JSON 定制优先用 Jackson2ObjectMapperBuilderCustomizer 做全局调整,单一类型用 @JsonComponent,最小改动用 @JsonFormat。