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

笔记加载中…