SpringBoot项目中,可以通过注解@Configuration注解,将WebMvcConfigurer通过@Bean注解注册到IOC容器中替换原本的WebMvcConfigurer实例,再注册之前可以通过重写其中的方法替换原本的组件,本篇文章就进行转换器 Converter 的定制操作。它可以将一个Object类转换为另一个Object类。
@Configuration
public class WebConfig {
@Bean
public WebMvcConfigurer webMvcConfigurer() {
return new WebMvcConfigurer() {
//在这里进行组件的定制化
};
}
}
Converter接口
通过接口的具体实现可以看到 Converter 中可以方法两个泛型,其中S表示原类型,T表示目标类型,返回类型也为目标类型T,即将类型S转换为类型T,再将其返回。
@FunctionalInterface
public interface Converter<S, T> {
@Nullable
T convert(S source);
default <U> Converter<S, U> andThen(Converter<? super T, ? extends U> after) {
Assert.notNull(after, "After Converter must not be null");
return (s) -> {
T initialResult = this.convert(s);
return initialResult != null ? after.convert(initialResult) : null;
};
}
}
相关操作类
Person类
注解@DateTimeFormat(pattern = "yyyy-MM-dd"),相当于将请求中的String格式的时间转换Date日期格式,等价于自定义的WebConfig重写转换器。
注解@Jsonforamt(pattern = "yyyy-MM-dd", timezone = "Asia/Shanghai"),针对json格式的数据,有时间的数据进行转换成指定的类型。
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Person {
private String name;
private int age;
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "Asia/Shanghai")
@DateTimeFormat(pattern = "yyyy-MM-dd")
private Date birthday;
//一对一 自定义的参数绑定
private Pet pet;
}
Pet类
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Pet {
private String petName;
private int petAge;
}
时间格式转换器 String -> Date
@Override
public void addFormatters(FormatterRegistry registry) {
//转换器 String -> Date
Converter<String,Date> converter = new Converter<String, Date>() {
@Override
public Date convert(String source) {
if(StringUtils.hasLength(source)){
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
try{
//通过日期格式类将字符串转换为指定格式的日期对象
Date date = sdf.parse(source);
return date;
}catch(Exception e){
throw new RuntimeException(e);
}
}
return null;
}
};
}
Controller
@RestController
public class CustomPojoController {
@PostMapping("/savePerson")
public Person testPerson(Person person){
person.setName("张三");
return person;
}
}
通过Postman进行测试
没有通过转换器转换时间数据类型
通过转换器转换后
格式转换器 String -> Pet
将字符串 Tom#16 转换为了Pet对象 ,其中petName为Tom,petAge为16
@Override
public void addFormatters(FormatterRegistry registry) {
//转换器 String -> Pet
Converter converter = new Converter<String, Pet>() {
@Override
public Pet convert(String source) {
if (StringUtils.hasLength(source)){
String[] strings = source.split("#");
Pet pet = new Pet(strings[0], Integer.valueOf(strings[1]));
return pet;
}
return null;
}
};
//通过registry 将定义的转换器传入
registry.addConverter(converter);
}