Spring5复习:创建字段属性Formatter工厂的注解(自定义字段格式化注解)

1.声明

当前内容主要用于测试和使用当前的字段格式化注解(用于解决特定字段的注解转换操作)

  1. 当前内容主要为AnnotationFormatterFactory这个的使用和Formatter的使用
  2. 当前解决问题为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.总结

  1. 使用自定义的注解方式获得了需要的数据类型,但是在写出的时候却不行
  2. 总的来说又加深了对Spring中的Converter和Formatter的理解
上一篇:CentOS7设置日系统时间为中国时区并启用NTP同步


下一篇:spring5的新特性