SpringBoot中的类型转换器


在使用spring的过程中,我们有没有发现它的扩展能力很强呢?由于这个优势的存在,使得spring具有很强的包容性,所以很多第三方应用可以很容易的投入到spring的怀抱中。

类型转换器
Spring目前支持3种类型的转换器:

  • Converter<S,T>: 将类型 S 的对象转换为类型 T 的对象
  • ConverterFactory<S, R>:将S型对象转换为R型和子类对象
  • GenericConverter:支持多种源和目标类型的转换,也提供源和目标类型的上下文。此上下文允许您根据注释或属性信息执行类型转换。

这三种类型的转换器在不同的场景下使用,我们Converter<S,T>举个例子。在接口中接收参数的实体对象中,有一个字段类型为Date,但实际传递的参数是字符串类型:2021-01-03 10:20:15,如何处理?

第一步是定义一个实体用户:

@Data
public class User {
    private Long id;
    private String name;
    private Date registerDate;
}


第二步是实现Converter接口:

public class DateConverter implements Converter<String, Date> {
private SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    @Override
    public Date convert(String source) {
        if (source != null && !"".equals(source)) {
            try {
                simpleDateFormat.parse(source);
            } catch (ParseException e) {
                e.printStackTrace();
            }
        }
        return null;
    }
}

第三步,将新定义的类型转换器注入到spring容器中:

@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {
@Override
    public void addFormatters(FormatterRegistry registry) {
        registry.addConverter(new DateConverter());
    }
}


第四步调用接口:

@RequestMapping("/user")
@RestController
public class UserController {
@RequestMapping("/save")
    public String save(@RequestBody User user) {
        return "success";
    }
}

请求接口时,对象registerDate中的字段User会自动转换为Date类型。