SpringBoot扩展SpringMVC

SpringBoot为什么要扩展SpringMVC?

SpringBoot虽然通过自动配置简化了SpringMVC的配置,但在实际开发中经常需要自定义SpringMVC的行为。

SpringBoot的默认配置可能不满足一下需求:

  • 自定义拦截器(登录验证、权限检查)
  • 跨域配置(CORS)
  • 格式化器(日期、数据格式化)
  • 视图控制器(直接映射URL到视图)
  • 静态资源处理
  • 消息转换器(JSON、XML处理)
  • 参数解析器(自定义请求参数解析)

WebMvcConfigurer接口的作用

WebMvcConfigurer是一个回调接口 ,允许开发者在不使用@EnableWebMvc的情况下定制SpringMVC的配置:

java 复制代码
public interface WebMvcConfigurer {
    // 配置路径匹配
    default void configurePathMatch(PathMatchConfigurer configurer) {}
    
    // 配置内容协商
    default void configureContentNegotiation(ContentNegotiationConfigurer configurer) {}
    
    // 配置异步支持
    default void configureAsyncSupport(AsyncSupportConfigurer configurer) {}
    
    // 配置默认Servlet处理
    default void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {}
    
    // 添加格式化器
    default void addFormatters(FormatterRegistry registry) {}
    
    // 添加拦截器
    default void addInterceptors(InterceptorRegistry registry) {}
    
    // 添加静态资源处理器
    default void addResourceHandlers(ResourceHandlerRegistry registry) {}
    
    // 添加CORS映射
    default void addCorsMappings(CorsRegistry registry) {}
    
    // 添加视图控制器
    default void addViewControllers(ViewControllerRegistry registry) {}
    
    // 配置视图解析器
    default void configureViewResolvers(ViewResolverRegistry registry) {}
    
    // 添加参数解析器
    default void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {}
    
    // 添加返回值处理器
    default void addReturnValueHandlers(List<HandlerMethodReturnValueHandler> handlers) {}
    
    // 配置消息转换器
    default void configureMessageConverters(List<HttpMessageConverter<?>> converters) {}
    
    // 扩展消息转换器
    default void extendMessageConverters(List<HttpMessageConverter<?>> converters) {}
    
    // 配置处理器异常解析器
    default void configureHandlerExceptionResolvers(List<HandlerExceptionResolver> resolvers) {}
    
    // 扩展处理器异常解析器
    default void extendHandlerExceptionResolvers(List<HandlerExceptionResolver> resolvers) {}
}

如何使用WebMvcConfigurer接口?

WebMvcConfigurer是SpringBoot给的MVC扩展入口,通过实现该接口并重写对应方法,可定制MVC行为,无需修改框架源码。

【一】注册视图控制器(请求转发)

视图控制器主要用于简化无业务逻辑的页面跳转,避免为简单的页面跳转创建空Controller。

**【问题】**为了一个简单的页面跳转,需要创建完整的Controller,这种Controller很冗余,只做转发工作。例如:

java 复制代码
@Controller
public class SimpleController {
    @GetMapping("/home")
    public String home() {
        return "home";  // 只是返回视图名,没有业务逻辑
    }
}

【解决】 可通过注册视图解析器进行简单页面直接跳转,不需要创建Controller。

【操作】 通过 @Configuration 注解创建配置类,在配置类中重写 WebMvcConfigurer接口中的 addViewControllers 方法。

java 复制代码
@Configuration
public class MyMvcConfig implements WebMvcConfigurer {
    // 注册视图控制器(请求转发/tx → success.html)
    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/tx").setViewName("success");

    }
}

【效果】 访问 http:///localhost:8080/tx,直接跳转到success.html,不用写@GetMapping("/tx")的Controller方法。

【实际应用场景】

  • 登录/注册页面
  • 主页和引导页
  • 错误页面
  • 静态内页面
  • 管理界面入口
  • 重定向功能
  • 状态码页面

【视图控制器的优势对比】

  • 传统方式:每个方法都很简单,只是返回视图名,方法体几乎为空
    • 产生大量样板代码
    • Controller类变得臃肿
    • 不易维护
  • 视图控制器方式:
    • 一行代码解决一个页面跳转
    • 清晰、简洁、易于管理

【使用建议】

  • 对于纯页面跳转(无业务逻辑)使用视图控制器
  • 将视图控制器按功能模块分类配置
  • 结合拦截器实现权限控制

【二】注册格式化器(Formatter)

【核心作用】

  • **parse():**字符串 → Date(接收数据)
  • **print():**Date → 字符串(显示数据)

**【问题】**没有格式化器时,每个方法都需要手动转换日期为字符串。代码重复、格式不统一、容易出错。

【解决】 可通过注册格式化器转换日期为字符串,且支持多种日期格式。

【操作】 通过 @Configuration 注解创建配置类,在配置类中重写 WebMvcConfigurer接口中的 addFormatters 方法。

java 复制代码
@Configuration
public class MyMvcConfig implements WebMvcConfigurer {
    // 注册注册格式化器(日期格式化)
    @Override
    public void addFormatters(FormatterRegistry registry) {
        registry.addFormatter(new Formatter<Date>() {
            // ============ 1. 多种日期格式支持 ============
            private final SimpleDateFormat[] formats = {
                new SimpleDateFormat("yyyy-MM-dd"),
                new SimpleDateFormat("yyyy/MM/dd"),
                new SimpleDateFormat("yyyy年MM月dd日"),
                new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"),
                new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'")  // ISO格式
            };
            @Override
            public Date parse(String text, Locale locale) throws ParseException {
                return new SimpleDateFormat("yyyy-MM-dd").parse(text);
                // parse(): 字符串 → Date(接收数据)
            }

            @Override
            public String print(Date date, Locale locale) {
                return new SimpleDateFormat("yyyy-MM-dd").format(date);
                // print(): Date → 字符串(显示数据)
            }
        });
    }
}

当然通过 application.yml配置也是可以办到的。

但用Formatter更灵活,能加自定义逻辑(比如校验日期合法性)。

**【效果】**将后端传递的 2005/2/2 格式转换为 2005-02-02

格式化优势

  • 全局同一转换,减少代码重复
  • 格式化同一
  • 集中错误处理,提高健壮性
  • 前后端协作,自动格式匹配,减少沟通成本
  • 安全可控

使用建议

  • 优先使用Spring内置的**@DateTimeFormat@NumberFormat**
  • 复杂场景使用自定义Formatter
  • 为常用业务对象(金额、日期、枚举)注册格式化器
  • 结合Converter使用更灵活

【三】注册消息转换器(FastJSON)

消息转换器是Spring MVC中负责HTTP请求/响应数据格式转换的核心组件。

作用】将 Java 对象与 JSON 数据相互转换

  • 输入:HTTP 请求中的 JSON 数据 → Java 对象
  • 输出:Java 对象 → HTTP 响应中的 JSON 数据

**【解决】**使用消息转换器后代码更简洁,且自动转换。

【操作】

  1. 先在pom.xml文件中引入fastjson依赖

    XML 复制代码
    <!--引入fastjson-->
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>fastjson</artifactId>
        <version>1.2.47</version>
    </dependency>
  2. 通过 @Configuration 注解创建配置类,在配置类中重写 WebMvcConfigurer接口中的 configureMessageConverters方法。

    java 复制代码
    @Configuration
    public class MyMvcConfig implements WebMvcConfigurer {
        // 注册FastJSON HTTP 消息转换器
        @Override
        public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
            // 1. 创建 FastJSON 消息转换器实例
            FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter();
            // 2. 创建 FastJSON 配置对象
            FastJsonConfig config = new FastJsonConfig();
            // 3. 设置序列化特性
            config.setSerializerFeatures(
                    SerializerFeature.PrettyFormat,           // 美化输出
                    SerializerFeature.WriteMapNullValue,      // 输出空值字段
                    SerializerFeature.WriteNullListAsEmpty,   // 空列表输出为 []
                    SerializerFeature.WriteNullStringAsEmpty, // 空字符串输出为 ""
                    SerializerFeature.WriteDateUseDateFormat // 日期格式化
            );
            // 4. 设置支持的媒体类型和字符编码
            List<MediaType> supportedMediaTypes = new ArrayList<>();
            supportedMediaTypes.add(MediaType.APPLICATION_JSON);
            supportedMediaTypes.add(MediaType.APPLICATION_JSON_UTF8);
            converter.setSupportedMediaTypes(supportedMediaTypes);
            // 5. 将配置应用到转换器
            converter.setFastJsonConfig(config);
            // 6. 将转换器添加到转换器列表
            converters.add(converter);
        }
    }

【效果】

【进阶】 实体类中可以用**@JSONField**注解定制字段,比如指定日期字段的输出格式:

java 复制代码
@JSONField(format = "yyyy-MM-dd")
private Date birth;

自定义转换器

  • 字符串转换:createStringConverter()
  • FastJson:createFastJsonConverter()
  • Jackson备用:createJacksonConverter()
  • 字节数组:createByteArrayConverter()
  • 资源文件:createResourceConverter()

【四】注册拦截器

核心作用 】拦截器是Spring MVC中AOP思想的具体实现 ,允许在请求处理的不同阶段插入自定义逻辑。

**【解决】**想在接口调用的不同阶段做统一处理,比如:

  • 请求处理前:校验用户是否登录;
  • 请求处理后:记录接口耗时;
  • 请求完成后:清理资源;

【操作】

  1. 创建拦截器类,实现HandlerInterceptor接口,重写3个核心方法:

    java 复制代码
    // 创建拦截器
    public class MyInterceptor implements HandlerInterceptor {
        // 前置拦截(核心:返回true放行,false拦截)
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
            String requestURI = request.getRequestURI();
            System.out.println("【前置拦截】请求路径" + requestURI + ",准备执行控制器方法");
            return true;// 放行
        }
    
        // 后置拦截:控制器方法执行后、视图渲染前调用(若控制器抛异常,此方法不执行)
        @Override
        public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
            System.out.println("【后置拦截】控制器方法执行完成,尚未渲染视图");
        }
    
        // 最终拦截:视图渲染完成后调用
        @Override
        public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
            System.out.println("【最终拦截】请求处理完成,视图已渲染,释放资源");
        }
    }
  2. 通过 @Configuration 注解创建配置类,在配置类中重写 WebMvcConfigurer接口中的 addInterceptors方法。

    java 复制代码
    @Configuration
    public class MyMvcConfig implements WebMvcConfigurer {
        // 注册拦截器
        @Override
        public void addInterceptors(InterceptorRegistry registry) {
            registry.addInterceptor(new MyInterceptor())  // 1. 创建拦截器实例
                    .addPathPatterns("/**")               // 2. 设置拦截路径(所有路径)
                    .excludePathPatterns("/hello");          // 3. 设置排除路径(/hello 路径不拦截)
        }
    }

【**关键】**拦截器的路径配置很灵活,能精准控制哪些接口需要拦截、哪些跳过。

【实际应用场景】

  • 权限认证和授权
  • 接口限流和防刷
  • 日志记录和性能监控
  • 数据预处理和后处理
  • 多拦截器链的实际应用

SpringBoot注册Servlet三大组件:Servlet、Filter、Listener

在传统的SSM项目中的web.xml中配置:

  • Servlet主要用于拦截和处理请求,以及调用Controller层
  • Filter主要用于配置字符编码格式,解决中文乱码的问题
  • Listener主要用于监听spring的配置文件有没有被加载

由于SpringBoot默认是以jar包的方式启动嵌入式的Servlet容器来启动SpringBoot的web应用,没有web.xml文件。

【一】注册Servlet

1. Servlet的核心作用

Servlet是Java EE规范中用于处理Web请求和响应的核心组件。它运行在Servlet容器(如Tomcat、Jetty)中,用于扩展服务器的功能,动态生成Web内容。

主要作用:

  1. **接收HTTP请求:**Servlet可以处理GET、POST等HTTP方法。
  2. **生成动态响应:**根据请求参数、会话状态等生成HTML、JSON、XML等动态内容。
  3. **会话管理:**通过HttpSession管理用户会话状态。
  4. **过滤器和监听器:**可以与过滤器(Filter)和监听器(Listener)结合,实现请求的预处理和后处理,以及监听上下文、会话等事件。

在Spring MVC中,DispatcherServlet是前端控制器,负责将请求分发给不同的处理器(Controller)。但是,我们仍然可以注册自定义的Servlet来处理特定的请求。

2. SpringBoot注册Servlet的方式

方式一使用配置类: 使用**@Bean** 注解注册 ServletRegistrationBean (推荐)

**第一步:**自定义Servlet,并继承 HttpServlet

java 复制代码
/**
 * 自定义Servlet
 */
public class MyServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
//        super.doGet(req, resp);
        resp.setContentType("text/html;charset=UTF-8");
        PrintWriter out = resp.getWriter();
        out.println("<h1>Hello from MyServlet</h1>");
        out.println("<p>当前时间: " + new Date() + "</p>");
        out.flush();
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
//        super.doPost(req, resp);
        // 设置响应编码,避免中文乱码
        resp.setContentType("text/html;charset=UTF-8");
        PrintWriter writer = resp.getWriter();
        // 向客户端输出响应内容
        writer.write("【自定义MyServlet】请求成功!");
        writer.write("<br/>请求路径:" + req.getRequestURI());
        writer.flush();
        writer.close();
    }
}

第二步:编写配置类

java 复制代码
@Configuration
public class WebServerConfig {
    @Bean
    public ServletRegistrationBean<MyServlet> myServlet(){
        System.out.println("=========Servlet开始=========");
        // 构造参数:1.自定义Servlet实例  2.Servlet映射访问路径(可传多个)
        ServletRegistrationBean<MyServlet> registrationBean =
                new ServletRegistrationBean<>(new MyServlet(), "/myServlet");
        // 访问http://localhost:8080/myServlet路径
        System.out.println("=========Servlet结束=========");
        return registrationBean;
    }
}

方式二使用注解: 使用**@ServletComponentScan@WebServlet**注解(Servlet 3.0+)

第一步: 自定义Servlet时,使用**@WebServlet**注解

java 复制代码
@WebServlet(urlPatterns = "/myServlet")
public class MyServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
//        super.doGet(req, resp);
        resp.setContentType("text/html;charset=UTF-8");
        PrintWriter out = resp.getWriter();
        out.println("<h1>Hello from MyServlet</h1>");
        out.println("<p>当前时间: " + new Date() + "</p>");
        out.flush();
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
//        super.doPost(req, resp);
        // 设置响应编码,避免中文乱码
        resp.setContentType("text/html;charset=UTF-8");
        PrintWriter writer = resp.getWriter();
        // 向客户端输出响应内容
        writer.write("【自定义MyServlet】请求成功!");
        writer.write("<br/>请求路径:" + req.getRequestURI());
        writer.flush();
        writer.close();
    }
}

**第二步:**在启动类上添加@ServletComponentScan

java 复制代码
// 在启动类上添加@ServletComponentScan
@SpringBootApplication
@ServletComponentScan
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

3. SpringBoot注册Servlet的适用场景

Spring Boot默认使用嵌入式Servlet容器,并且通过自动配置注册了DispatcherServlet作为默认的Servlet。然而,在某些情况下,我们可能需要注册额外的自定义Servlet。

适用场景:

  1. **处理特定的URL模式:**当需要为特定的URL路径(如/legacy、/report等)提供特定的处理逻辑时,而这些逻辑不适合放在Spring MVC的控制器中。
  2. 与第三方库集成: 有些第三方库可能以Servlet的形式提供功能(例如,一些监控工具、文件上传组件等)。例如,H2数据库的控制台、Druid监控界面等。
  3. 性能考虑: 对于某些简单的请求(如健康检查、状态监控),直接使用Servlet处理可能比经过Spring MVC的完整处理链更高效。
  4. **迁移旧系统:**在将旧系统(基于Servlet/JSP)迁移到Spring Boot时,为了逐步迁移,可以先将已有的Servlet注册到Spring Boot中,然后逐步重构为Spring MVC的控制器。
  5. 特殊协议处理: 如果需要处理非HTTP协议(如WebSocket、FTP等),但运行在Servlet容器中,可能需要自定义Servlet。
  6. **静态资源处理:**虽然Spring Boot提供了静态资源处理,但有时可能需要更复杂的静态资源处理逻辑(如动态生成图片、PDF等),这时可以使用Servlet。

黄金法则:

默认使用Spring MVC Controller,只在有明确需求(性能、集成、特殊处理)时才考虑注册自定义Servlet。


【二】注册过滤器 - Filter

1. Filter的核心作用

Filter(过滤器)是Java Servlet规范中的一部分,它可以对HTTP请求进行预处理,也可以对HTTP响应进行后处理。Filter通常用于一些公共的处理逻辑,比如日志记录、字符编码转换、身份认证、权限检查、数据压缩等。

2. Filter的执行顺序

  • 在**doFilter方法中,调用filterChain.doFilter(request, response)**之前,是对请求的预处理。

  • 调用**filterChain.doFilter(request, response)**之后,是对响应的后处理。

3. SpringBoot注册过滤器 - Filter的方式

方式一使用配置类: 使用**@Bean** 注解注册FilterRegistrationBean(可以控制顺序和URL模式)

**第一步:**自定义Filter,并实现 Filter

⭐⭐⭐注意:必须调用 Chain.doFilter(),否则请求不会继续。

java 复制代码
/**
 * 自定义Filter实现Filter接口,重写doFilter核心方法
 * 作用:拦截指定路径的请求,打印拦截日志
 */
public class MyFilter implements Filter {
    /**
     * 核心拦截方法:所有被拦截的请求都会执行此方法
     * @param filterChain 过滤器链:放行请求到下一个过滤器/目标资源
     */
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("过滤器执行: 请求预处理");

        // 必须调用 filterChain.doFilter(),否则请求不会继续
        filterChain.doFilter(servletRequest, servletResponse);

        System.out.println("过滤器执行: 响应后处理");
    }
}

第二步: 编写配置类

java 复制代码
@Configuration
public class WebServerConfig {
    @Bean
    public FilterRegistrationBean myFilter(){
        System.out.println("=========过滤器开始=========");
        FilterRegistrationBean registrationBean = new FilterRegistrationBean();
        registrationBean.setFilter(new MyFilter());
        // 设置拦截路径
        registrationBean.setUrlPatterns(Arrays.asList("/tx","/myServlet"));

        System.out.println("=========过滤器结束=========");
        return registrationBean;
    }
}

方式二使用注解: 使用**@Component**注解Filter类(默认拦截所有URL,顺序不确定)

第一步: 自定义Filter时,使用**@Component**注解

java 复制代码
/**
 * 自定义Filter实现Filter接口,重写doFilter核心方法
 * 作用:拦截指定路径的请求,打印拦截日志
 */
@Component
public class MyFilter implements Filter {
    // 实现同上
}

第二步: 在启动类上添加**@ServletComponentScan**

4. Filter与Interceptor的区别

特性 Filter Interceptor
规范 Servlet规范 Spring MVC规范
作用范围 所有Web资源(Servlet、JSP、静态资源等) 只针对Spring MVC的Handler(Controller)
依赖 依赖Servlet容器 依赖Spring容器
获取Bean 不能直接获取Spring Bean 可以直接获取Spring Bean
使用场景 字符编码、跨域、日志、安全等 权限验证、业务日志、性能监控等

黄金法则:

Filter处理HTTP协议层面的事情,Interceptor处理业务层面的事情。

【三】注册监听器 - Listener

Listener是Servlet规范中的核心组件之一,用于监听Web应用中的事件。

1. 常见的监听器类型

监听器是用来监听 Servlet 容器事件的组件。常见的监听器类型有:

  1. ServletContextListener - 监听上下文生命周期

  2. HttpSessionListener - 监听会话生命周期

  3. ServletRequestListener - 监听请求生命周期

2. SpringBoot创建监听器 - Listener的方式

方式一使用配置类: 使用**@Bean** 注解注册ServletListenerRegistrationBean

**第一步:**自定义Listener,并实现 ServletContextListener等

java 复制代码
/**
 * 自定义Listener
 */
public class MyListener implements ServletContextListener,
        HttpSessionListener,
        ServletRequestListener {

    // ServletContextListener 方法
    @Override
    public void contextInitialized(ServletContextEvent sce) {
        System.out.println("上下文初始化");
    }

    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        System.out.println("上下文销毁");
    }

    // HttpSessionListener 方法
    @Override
    public void sessionCreated(HttpSessionEvent se) {
        System.out.println("会话创建: " + se.getSession().getId());
    }

    @Override
    public void sessionDestroyed(HttpSessionEvent se) {
        System.out.println("会话销毁: " + se.getSession().getId());
    }

    // ServletRequestListener 方法
    @Override
    public void requestInitialized(ServletRequestEvent sre) {
        System.out.println("请求开始");
    }

    @Override
    public void requestDestroyed(ServletRequestEvent sre) {
        System.out.println("请求结束");
    }
}

第二步:编写配置类

java 复制代码
@Configuration
public class WebServerConfig {
    @Bean
    public ServletListenerRegistrationBean<MyListener> myListener(){
        System.out.println("=========监听器开始=========");
        ServletListenerRegistrationBean<MyListener> registrationBean = new ServletListenerRegistrationBean<>(new MyListener());
        System.out.println("=========监听器结束=========");
        return registrationBean;
    }
}

方式二使用注解: 使用**@WebListener**注解Listener类

第一步: 自定义Listener时,使用**@WebListener**注解

java 复制代码
/**
 * 自定义Listener
 */
@WebListener
public class MyListener implements ServletContextListener,
        HttpSessionListener,
        ServletRequestListener {
    // 实现代码同上
}

第二步: 在启动类上添加**@ServletComponentScan**

3. 典型业务场景

  • 服务器启动时初始化全局数据(如加载字典数据到内存);
  • 统计在线用户数(监听Session的创建/销毁);
  • 监听请求创建,记录所有请求的访问日志;
  • 服务器关闭时清理资源(如关闭连接池)。

黄金法则:

Listener用于监听系统级事件,在事件发生时执行全局性的、非业务逻辑的操作。


扩展:@JsonField && @DateTimeFormat

  1. @JSONField:是阿里巴巴FastJSON库中的注解,用于控制Java对象与JSON字符串之间的序列化和反序列化。

  2. @DateTimeFormat:是Spring框架中的注解,用于处理HTTP请求中的日期时间字符串到Java日期时间对象的转换。

@JsonField

所属库 】@JsonField 是 FastJSON中的一个注解,属于 com.alibaba.fastjson.annotation.JSONField 包。

XML 复制代码
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.47</version>
</dependency>

核心作用】处理 JSON ↔ Java对象 之间的转换(序列化/反序列化)。

把Java对象转成前端能看懂的JSON字符串(序列化),或把前端传的JSON字符串转回Java对象(反序列化)。

实际应用场景

  • 设置日期字段的JSON格式(例如:把Java的Date转成2026-02-01);
  • 改JSON字段名(例如:Java字段username,JSON里想叫user_name);
  • 敏感信息控制(例如:身份证号:入库时使用,返回时脱敏)。

实例日期格式化的配置

java 复制代码
@JSONField(format = "yyyy-MM-dd HH:mm:ss")
private Date birth;

@DateTimeFormat(Spring框架,常被误称@DateFormat)

所属库@DateTimeFormatSpring Framework 中的一个注解,属于 org.springframework.format.annotation 包。

XML 复制代码
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-web</artifactId>
    <version>5.x.x</version>
</dependency>

核心作用 】处理 前端表单/URL参数 ↔ Java方法参数 之间的转换。

它用于在Spring MVC中格式化日期和时间字段,特别是在处理表单数据或URL参数时,将字符串参数转换为日期/时间类型(如java.util.Date、java.time.LocalDate等)。

主要特点

  1. 主要用于前端到后端的数据绑定(如请求参数、表单字段)。
  2. 可以注解在方法参数、字段或方法上。
  3. 支持多种日期时间格式,可以通过pattern属性指定。

实例日期格式化的配置

java 复制代码
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date birth;

核心区别总览

维度 @JSONField (FastJSON) @DateTimeFormat (Spring)
所属库 阿里巴巴 FastJSON Spring Framework
主要用途 JSON序列化/反序列化 HTTP请求参数绑定
应用场景 Java对象 ↔ JSON字符串 字符串参数 → Java对象
作用阶段 对象与JSON转换时 请求参数绑定时
相关推荐
逝水如流年轻往返染尘6 分钟前
JAVA中的抽象类
java·开发语言
hx8622731 分钟前
Java MySQL 连接
java·mysql·adb
lpfasd12333 分钟前
Kubernetes (K8s) 底层早已不再直接使用 Docker 引擎了
java·docker·kubernetes
aq553560036 分钟前
SpringBoot有几种获取Request对象的方法
java·spring boot·后端
steel80881 小时前
Spring Boot 整合 log4j2 日志配置教程
spring boot·单元测试·log4j
lierenvip1 小时前
Spring Boot中Tomcat配置
spring boot·tomcat·firefox
Detachym1 小时前
InsightFlow 服务配置优化与部署实践
java·spring boot·tomcat·maven·状态模式·jar
rainchestnut1 小时前
Spring AI 初步集成(1)-初始化
spring boot
y = xⁿ1 小时前
【LeetCodehot100】T23:合并k个升序链表
java·数据结构·链表
流水武qin2 小时前
SpringAI多模态的基本使用
java·spring boot·spring·ai