日期类型转换进阶
深入探讨SpringMVC日期类型转换的高级配置与自定义实现。
自定义转换器
实现Converter接口创建自定义转换器:
Java
public class StringToDateConverter implements Converter<String, Date> {
@Override
public Date convert(String source) {
try {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
return sdf.parse(source);
} catch (ParseException e) {
throw new IllegalArgumentException("日期格式错误");
}
}
}
注册转换器
Java
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addFormatters(FormatterRegistry registry) {
registry.addConverter(new StringToDateConverter());
}
}
多日期格式支持
支持多种日期格式转换:
Java
public class MultiFormatDateConverter implements Converter<String, Date> {
private static final String[] FORMATS = {
"yyyy-MM-dd",
"yyyy/MM/dd",
"yyyy-MM-dd HH:mm:ss",
"yyyy年MM月dd日"
};
@Override
public Date convert(String source) {
for (String format : FORMATS) {
try {
SimpleDateFormat sdf = new SimpleDateFormat(format);
sdf.setLenient(false);
return sdf.parse(source);
} catch (ParseException ignored) {
}
}
throw new IllegalArgumentException("无法解析日期: " + source);
}
}
格式化注解
使用@DateTimeFormat指定格式:
Java
public class Event {
private Integer id;
private String name;
@DateTimeFormat(pattern = "yyyy-MM-dd")
private Date eventDate;
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date createTime;
}
JSON日期格式
返回JSON时的日期格式化:
使用JsonFormat
Java
public class User {
private Integer id;
private String name;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date createTime;
}
全局配置
Java
@Configuration
public class JacksonConfig {
@Bean
public Jackson2ObjectMapperBuilderCustomizer customizer() {
return builder -> {
builder.simpleDateFormat("yyyy-MM-dd HH:mm:ss");
builder.timeZone(TimeZone.getTimeZone("GMT+8"));
};
}
}
类型转换器工厂
使用ConverterFactory批量转换:
Java
public class StringToEnumConverterFactory implements ConverterFactory<String, Enum<?>> {
@Override
public <T extends Enum<?>> Converter<String, T> getConverter(Class<T> targetType) {
return source -> (T) Enum.valueOf(targetType, source.toUpperCase());
}
}
属性编辑器
传统方式使用PropertyEditor:
Java
@Controller
public class DateController {
@InitBinder
public void initBinder(WebDataBinder binder) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
sdf.setLenient(false);
binder.registerCustomEditor(Date.class, new CustomDateEditor(sdf, true));
}
}
| 方式 | 适用场景 |
|---|---|
| Converter | 全局类型转换 |
| @DateTimeFormat | 单字段格式化 |
| @JsonFormat | JSON序列化格式化 |
| PropertyEditor | 控制器级别配置 |
要点总结
- Converter:全局类型转换,推荐使用
- @DateTimeFormat:请求参数绑定时的日期格式
- @JsonFormat:JSON响应时的日期格式
- 支持多格式解析,提高容错性
📝 发现内容有误?点击此处直接编辑