场景:发送GET请求时携带自定义的格式化参数(例如url=xxx?user=username:password)时,希望通过在入参处使用注解@RequestParam @UserFormat(":") User user实现参数的解析,其中@UserFormat(":")为自定义注解。
方法:springMVC会在内部注册DateTimeFormatAnnotationFormatterFactory,使得我们能够使用@DateTimeFormat注解,对格式化的字符串进行解析获得Date类。同样我们也需要一个实现AnnotationFormatterFactory接口的类并进行注册,才能够使用自定义注解。
1.AnnotationFormatterFactory的实现类
public class UserFormatAnnotationFormatterFactory implements AnnotationFormatterFactory<UserFormat> {
private static final Set<Class<?>> FIELD_TYPES;
static{
FIELD_TYPES=new HashSet<>(1);
FIELD_TYPES.add(User.class);
}
@Override
public Set<Class<?>> getFieldTypes(){
return this.FIELD_TYPES;
}
@Override
public Parser<?> getParser(UserFormat annotation,Class<?> fieldType){
return new UserFormatter(annotation.value());
}
@Override
public Printer<?> getPrinter(UserFormat annotation, Class<?> fieldType){
return new UserFormatter(annotation.value());
}
private static class UserFormatter implements Formatter<User> {
private String mask;
public UserFormatter(String mask){
this.mask=mask;
}
@Override
public User parse(String text, Locale locale){
User user=new User();
String[] strArr=text.split(mask);
user.setUserName(strArr[0]);
user.setPassword(strArr[1]);
return user;
}
@Override
public String print(User user,Locale locale){
return user.getUserName()+mask+user.getPassword();
}
}
}
2.自定义注解(Annotation的实现类)
@Target(value={ElementType.METHOD,ElementType.FIELD,ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface UserFormat {
String value();
}
3.注册AnnotationFormatterFactory的实现类
//在WebMvcConfigurer实现类中注册AnnotationFormatterFactory的实现类,以使用注解驱动的格式化功能
@Override
public void addFormatters(FormatterRegistry registry) {
registry.addFormatterForFieldAnnotation(new MaskFormatAnnotationFormatterFactory());
}