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转换时 请求参数绑定时
相关推荐
毕设源码-郭学长2 小时前
【开题答辩全过程】以 高校项目团队管理网站为例,包含答辩的问题和答案
java
NE_STOP2 小时前
spring6-工厂设计模式与bean的实例化方式
spring
玄〤2 小时前
Java 大数据量输入输出优化方案详解:从 Scanner 到手写快读(含漫画解析)
java·开发语言·笔记·算法
独自破碎E2 小时前
Spring Boot + LangChain4j 报错:Bean 类型不匹配的解决办法
spring boot·python·pycharm
tb_first2 小时前
SSM速通3
java·jvm·spring boot·mybatis
独自破碎E2 小时前
总持续时间可被 60 整除的歌曲
java·开发语言
Python+JAVA+大数据2 小时前
TCP_IP协议栈深度解析
java·网络·python·网络协议·tcp/ip·计算机网络·三次握手
丶小鱼丶2 小时前
Java基础之【多线程】
java
东东5163 小时前
基于vue的电商购物网站vue +ssm
java·前端·javascript·vue.js·毕业设计·毕设