springboot Date参数

在SpringBoot应用中,遇到一个问题:当前端传递日期格式为'yyyy-MM-dd HH:mm:ss'的参数时,Controller无法将其转换为Date类型。这可能是由于日期格式不匹配导致的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题 前端传入时间参数(yyyy-MM-dd HH:mm:ss)controller无法接收为Date类型数据

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
	@Override
	public void addFormatters(FormatterRegistry registry) {
		registry.addConverter(new Converter<String, Date>() {
			private final SimpleDateFormat FORMAT1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
			private final SimpleDateFormat FORMAT2 = new SimpleDateFormat("yyyy-MM-dd");
			@Override
			public Date convert(String source) {
				Date date=null;
				try {
					date=FORMAT1.parse(source);
				} catch (ParseException e) {
					try {
						date=FORMAT2.parse(source);
					} catch (ParseException e1) {
						
					}
				}
				return date;
			}
		});
		WebMvcConfigurer.super.addFormatters(registry);
	}
}
### 如何在 Spring Boot 中进行 `LocalDateTime` 类型的参数校验 为了实现对 `LocalDateTime` 类型的参数校验,在控制器方法中可以利用 Hibernate Validator 提供的标准注解来定义约束条件。对于更复杂的场景,比如自定义格式验证,则可能需要结合 `@JsonFormat` 注解以及创建特定的约束注解处理器。 当处理来自客户端请求中的时间数据时,可以通过设置 `@JsonFormat` 来规定输入的时间字符串应该遵循何种模式[^2]: ```java import com.fasterxml.jackson.annotation.JsonFormat; import javax.validation.constraints.NotNull; public class EventRequest { @NotNull(message = "Event date cannot be null") @JsonFormat(shape= JsonFormat.Shape.STRING, pattern="yyyy-MM-dd HH:mm:ss", timezone="GMT+8") private LocalDateTime eventDate; } ``` 上述代码片段展示了如何通过组合使用 `@NotNull` 和 `@JsonFormat` 对象来进行基本的有效性检查和格式转换。这里设置了日期时间的具体显示样式为 `"yyyy-MM-dd HH:mm:ss"` 并指定了东八区作为默认时区。 除了内置的支持外,还可以编写自己的约束验证器以便更好地满足业务需求。这涉及到定义一个新的注解类并注册相应的 `ConstraintValidator` 实现。下面是一个简单的例子说明怎样构建一个针对 `LocalDateTime` 的最小值检验逻辑: #### 自定义约束注解及其验证器 1. 定义新的注解 `MinLocalDateTime.java`: ```java import javax.validation.Constraint; import javax.validation.Payload; import java.lang.annotation.*; @Documented @Constraint(validatedBy = MinLocalDateTimeValidator.class) @Target({ ElementType.METHOD, ElementType.FIELD }) @Retention(RetentionPolicy.RUNTIME) public @interface MinLocalDateTime { String message() default "{com.example.MinLocalDateTime.message}"; Class<?>[] groups() default {}; Class<? extends Payload>[] payload() default {}; // 设置最低允许的时间点,默认设为当前时刻之前一天 String value() default "-P1D"; } ``` 2. 创建对应的验证器 `MinLocalDateTimeValidator.java` : ```java import javax.validation.ConstraintValidator; import javax.validation.ConstraintValidatorContext; import java.time.LocalDateTime; import java.time.format.DateTimeParseException; public class MinLocalDateTimeValidator implements ConstraintValidator<MinLocalDateTime, LocalDateTime> { private Period period; public void initialize(MinLocalDateTime constraintAnnotation) { try{ this.period = Period.parse(constraintAnnotation.value()); } catch (Exception e){ throw new IllegalArgumentException("Invalid duration format.",e); } } public boolean isValid(LocalDateTime dateTime, ConstraintValidatorContext context){ if(dateTime == null || !dateTime.isAfter(LocalDateTime.now().plus(period))){ return false; } return true; } } ``` 以上实现了基于 ISO 8601 时间间隔表示法的一个简易版过去时间段限制功能。请注意实际应用中应当更加严谨地考虑边界情况和其他潜在问题。 最后一步是在实体属性上标注此新创建的注解以启用定制化的规则: ```java import org.hibernate.validator.constraints.NotEmpty; public class BookingDTO { @NotEmpty private String name; @MinLocalDateTime(value="-PT1H",message="The booking time must not earlier than one hour from now.") private LocalDateTime startTime; ... } ``` 这样就完成了一个完整的关于 `LocalDateTime` 参数校验机制的设计与实施过程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值