数据绑定3-Formatter和Converter

概览:

两者的作用一样,都是类型转换。

org.springframework.format.Formatter只能做String类型到其他类型的转换。

org.springframework.core.convert.converter.Converter可以做任意类型的转换。

 

Converter是一般工具,可以将一种类型转换成另一种类型。例如,将String转换成Date,或者将Long转换成Date。Converter既可以用在web层,也可以用在其它层中。Formatter只能将String转成成另一种java类型。例如,将String转换成Date,但它不能将Long转换成Date。

 

如果同时定义了Converter和Formatter,并且转换同一个类型,会采用哪个进行转换?

测试证明,同时定义Student的转换类,会采用Formatter

 

Formatter使用示例

1.定义Formatter类:

需要实现Formatter接口, 并在pase方法中进行转换的逻辑。通过@Component自动将其添加到SpringBoot容器,这样就会自动生效。

 

@Component
public class StudentFormatter implements Formatter<Student> {
    /**
     * 校验不太严密,仅作演示
     */
    @Override
    public Student parse(String text, Locale locale) {
        if (NumberUtils.isParsable(text)) {
            Student s =  new Student();
            s.setAge(Integer.parseInt(text));
            return s;
        }
        return null;
    }

    @Override
    public String print(Student money, Locale locale) {
        if (money == null) {
            return null;
        }
        return money.getAge()+"";
    }
}

 

Controller中的代码:

 

@PostMapping(path = "/stu")
@ResponseBody
public String sst(NewRequest newCoffee) {
    return newCoffee.getStudent().getAge()+"";
}

 

数据实体:

@Getter
@Setter
@ToString
public class NewRequest {
    private String name;
    private Student student;
}

 

这样当访问http://localhost:8080/stu?newCoffee=123 

传递的newCoffee字符串会自动转化为NewRequest实体 

 

Converter使用示例

创建转换类:其他步骤和Formatter完全一样

 

@Component
public class StudentConvert implements Converter<String ,Student> {

    @Override
    public Student convert(String text) {
        if (NumberUtils.isParsable(text)) {
            Student s =  new Student();
            s.setAge(Integer.parseInt(text));
            return s;
        }
        return new Student();
    }
}

 

posted @ 2020-01-20 10:38  reload  阅读(257)  评论(0编辑  收藏  举报