spring boot 2.0 WebMvcConfigurerAdapter 方法已经过时(还有Date类型的输出格式)

本文介绍如何在SpringBoot中配置全局拦截器,并详细解释如何调整日期字段的显示格式,包括转换为时间戳或UTC字符串的方法。

第一种:


import cc.datebook.aop.LoginInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.config.annotation.*;

@Configuration
public class WebAppConfig implements WebMvcConfigurer{

    @Bean
    public HandlerInterceptor getLoginInterceptor(){
        return new LoginInterceptor();
    }

    @Override
    public void addInterceptors(InterceptorRegistry registry){
        registry.addInterceptor(getLoginInterceptor())
                .addPathPatterns("/**")
                .excludePathPatterns("/error")
                .excludePathPatterns("/static/*");
    }

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry){
        registry.addResourceHandler("/static/**")
                .addResourceLocations("classpath:/static/");
    }

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")//设置允许跨域的路径
                .allowedOrigins("*")//设置允许跨域请求的域名
                .allowCredentials(true)//是否允许证书 不再默认开启
                .allowedMethods("GET", "POST", "PUT", "DELETE")//设置允许的方法
                .maxAge(3600);//跨域允许时间
    }
}

使用这个在升级springboot2.0之后会把Date类型字段自动给转成UTC字符串 如:1990-11-26T16:00:00.000+0000,如果想转成时间戳在application.properties配置文件增加以下配置:

spring.jackson.serialization.write-dates-as-timestamps=true
spring.jackson.time-zone=GMT+8

第二种(会导致springboot的自动配置失效):


@Configuration
public class WebAppConfig extends WebMvcConfigurationSupport{

        ...

}

这种方式会把Date类型字段自动给转成时间戳,如果想用UTC字符串,在application.properties配置文件增加以下配置

spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
spring.jackson.time-zone=GMT+8
<think> 我们正在讨论Spring框架中解析Cron表达式的工具。根据引用[3],Spring提供了`CronSequenceGenerator`类来解析Cron表达式并计算下一次执行时间。然而,需要注意的是,从Spring 5.3开始,`CronSequenceGenerator`被标记为过时(deprecated),推荐使用`CronExpression`类(在Spring 5.3中引入)作为替代。 下面我将分别介绍这两种方式: ### 1. 使用过时的`CronSequenceGenerator`(Spring 5.3之前) 在Spring 5.3之前的版本,可以使用`org.springframework.scheduling.support.CronSequenceGenerator`来解析Cron表达式。这个类可以计算给定Cron表达式的下一次执行时间。 示例代码(来自引用[3]): ```java import org.springframework.scheduling.support.CronSequenceGenerator; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; public class CronParserExample { public static void main(String[] args) { String cron = "0 0 0 1 1/1 ?"; // 每月1号执行 CronSequenceGenerator generator = new CronSequenceGenerator(cron); Date currentDate = new Date(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); List<String> nextExecutions = new ArrayList<>(); for (int i = 0; i < 10; i++) { currentDate = generator.next(currentDate); nextExecutions.add(sdf.format(currentDate)); } nextExecutions.forEach(System.out::println); } } ``` ### 2. 使用推荐的`CronExpression`(Spring 5.3+) 在Spring 5.3及更高版本,推荐使用`org.springframework.scheduling.support.CronExpression`类,它提供了更强大的解析能力和更好的错误信息。 示例代码: ```java import org.springframework.scheduling.support.CronExpression; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.stream.Stream; public class CronExpressionExample { public static void main(String[] args) { String cron = "0 0 0 1 1/1 ?"; // 每月1号执行 CronExpression expression = CronExpression.parse(cron); LocalDateTime baseTime = LocalDateTime.now(); DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); Stream.iterate(baseTime, expression::next) .limit(10) .map(formatter::format) .forEach(System.out::println); } } ``` ### 主要区别: - `CronExpression`使用Java 8的日期时间API(如`LocalDateTime`),而`CronSequenceGenerator`使用旧的`Date`类。 - `CronExpression`提供了更清晰的API,如`parse`静态方法和`next`方法,支持流式操作。 - `CronExpression`在解析错误时提供更详细的异常信息。 ### 注意事项: - 确保你的Spring版本在5.3以上才能使用`CronExpression`。 -Spring Boot应用中,通常不需要直接使用这些类,因为定时任务可以通过`@Scheduled`注解自动解析Cron表达式。但如果你需要手动解析(如从数据库读取表达式并计算下次执行时间),则可以使用上述工具。 如果你的项目使用的是较旧的Spring版本(低于5.3),则只能使用`CronSequenceGenerator`。否则,建议使用新的`CronExpression`。 ### 参考: - [Spring Framework Documentation: CronExpression](https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/scheduling/support/CronExpression.html) - [Spring Framework Documentation: CronSequenceGenerator (Deprecated)](https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/scheduling/support/CronSequenceGenerator.html) 如果解决了您的问题,请告知![^3] §§相关问题§§ 1. Spring Boot中如何配置动态Cron表达式(从数据库读取)? 2. 如何验证Cron表达式的合法性? 3. Spring定时任务中Cron表达式与固定延迟(fixedDelay)有何区别? </think> ### Spring中解析Cron表达式的工具详解 在Spring框架中,主要提供了以下两种工具用于解析和操作Cron表达式: --- #### 1. **`CronSequenceGenerator`(旧版工具)** 这是Spring早期版本提供的解析工具,可以直接计算Cron表达式的下一次执行时间。 ```java import org.springframework.scheduling.support.CronSequenceGenerator; import java.util.*; // 解析每月1号执行的表达式 String cron = "0 0 0 1 * ?"; CronSequenceGenerator generator = new CronSequenceGenerator(cron); // 计算未来10次执行时间 Date baseTime = new Date(); List<Date> nextExecutions = new ArrayList<>(); for (int i = 0; i < 10; i++) { baseTime = generator.next(baseTime); nextExecutions.add(baseTime); } ``` **特点**: - 直接返回`Date`对象的结果 - 需要手动循环获取多次执行时间 - Spring 5.3+ 已标记为`@Deprecated`[^3] --- #### 2. **`CronExpression`(新版推荐工具)** Spring 5.3+ 引入的现代化API,基于Java 8时间API设计: ```java import org.springframework.scheduling.support.CronExpression; import java.time.*; // 创建解析器实例 CronExpression expression = CronExpression.parse("0 0 9 * * MON-FRI"); // 计算下次执行时间(支持时区) LocalDateTime nextTime = expression.next(LocalDateTime.now()); // 流式获取多次执行时间 expression.next(LocalDateTime.now()) .map(time -> time.plusSeconds(30)) // 可附加操作 .limit(5) // 限制结果数量 .forEach(System.out::println); ``` **优势**: - 使用`java.time` API(线程安全) - 支持流式操作(`Stream<LocalDateTime>`) - 内置时区处理能力(`ZoneId`) - 更清晰的异常信息(如无效表达式)[^3] --- ### 使用场景对比 | 场景 | 推荐工具 | |------|----------| | 旧版Spring兼容 | `CronSequenceGenerator` | | 新版Spring(5.3+) | `CronExpression` | | 动态计算单次执行时间 | 两者均可 | | 批量获取执行计划 | `CronExpression.next().stream()` | | 时区敏感调度 | `CronExpression.withZone()` | > **最佳实践**:新项目建议优先使用`CronExpression`,它支持更现代的日期时间操作,并能无缝整合Spring Boot的定时任务配置[^2]。 如果上述工具解决了您的需求,请告知![^3]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值