1.声明
当前内容主要用于测试和使用当前的字段格式化注解(用于解决特定字段的注解转换操作)
- 当前内容主要为AnnotationFormatterFactory这个的使用和Formatter的使用
- 当前解决问题为Date类型的数据,前台传递字符后台接收对象
2.创建自己的字段注解MyDataFormat
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE})
public @interface MyDataFormat {
String pattern() default "yyyy-MM-dd HH:mm:ss";
}
主要参考原型Spring中的@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
3.创建日期转换器类MyDateFormat
public class MyDateFormat implements Formatter<Date>{
private String parttern;
public MyDateFormat(String parttern) {
super();
this.parttern = parttern;
}
@Override
public String print(Date object, Locale locale) {
// TODO Auto-generated method stub
return new SimpleDateFormat(parttern).format(object);
}
@Override
public Date parse(String text, Locale locale) throws ParseException {
// TODO Auto-generated method stub
return new SimpleDateFormat(parttern).parse(text);
}
}
当前类主要实现Formatter接口
4.创建注解工厂MyDataFormatAnnotationFactory
public class MyDataFormatAnnotationFactory implements AnnotationFormatterFactory<MyDataFormat> {
@Override
public Set<Class<?>> getFieldTypes() {
// TODO Auto-generated method stub
return new HashSet<Class<?>>(Arrays.asList(Date.class));
}
@Override
public Printer<?> getPrinter(MyDataFormat annotation, Class<?> fieldType) {
// TODO Auto-generated method stub
return configureFormatterFrom(annotation, fieldType);
}
@Override
public Parser<?> getParser(MyDataFormat annotation, Class<?> fieldType) {
// TODO Auto-generated method stub
return configureFormatterFrom(annotation, fieldType);
}
// 将所有的处理操作放在这里解决
private Formatter<Date> configureFormatterFrom(MyDataFormat annotation, Class<?> fieldType) {
if (!annotation.pattern().isEmpty()) {
return new MyDateFormat(annotation.pattern());
} else {
return new MyDateFormat(annotation.pattern());
}
}
}
5.添加当前的注解工厂
@Configuration
@EnableWebMvc
@ComponentScan( basePackages = {"com.hy.springweb.controller","com.hy.springweb.convert"})
public class MVCConfig implements WebMvcConfigurer {
@Override
public void addFormatters(FormatterRegistry registry) {
// TODO Auto-generated method stub
registry.addFormatterForFieldAnnotation(new MyDataFormatAnnotationFactory());
WebMvcConfigurer.super.addFormatters(registry);
}
}
6.为实体类的属性添加@MyDataFormat注解
public class User {
private String name;
@MyDataFormat
private Date birth;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Date getBirth() {
return birth;
}
public void setBirth(Date birth) {
this.birth = birth;
}
@Override
public String toString() {
return "User [name=" + name + ", birth=" + birth + "]";
}
}
其余的配置参照我的这篇博文:纯注解方式启动SpringMVC
测试结果:User [name=王五, birth=Mon Nov 12 11:11:11 CST 2018]
,成功!
但是感觉不能向前台直接写出字段,感觉有点遗憾(个人估计需要使用fastjson或者其他的才会向前台输出吧!)
6.总结
- 使用自定义的注解方式获得了需要的数据类型,但是在写出的时候却不行
- 总的来说又加深了对Spring中的Converter和Formatter的理解