在使用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类型。