Spring 类型转换

匿名 (未验证) 提交于 2019-12-03 00:22:01

https://docs.spring.io/spring-boot/docs/2.0.2.RELEASE/reference/htmlsingle/#boot-features-external-config-conversion

spring boot 配置文件 application.properties 配置了一个日期,文件里的属性值只能是字符串,我们在配置类中定义的是Date类型,所以需要将字符串转换成Date类型。转换方式有两种,一种是使用PropertyEditor,另外一种是使用Converter

//application.properties platform.version=1.0 platform.release=2018-05-25
//Platform.java @ConfigurationProperties("platform") @Component public class Platform {      private String version;      private Date release;      //getter and setter }

PropertyEditor

针对上述案例,我们可以提供一个自定义的PropertyEditor。可以直接实现PropertyEditor接口,或更为常见的做法是继承PropertyEditorSupport,然后实现如下两个方法:

  • String getAsText()
  • void setAsText(String text)
public class CustomDateEditor extends PropertyEditorSupport {      private final DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");      @Override     public String getAsText() {         Date value = (Date)getValue();         return dateFormat.format(value);     }      @Override     public void setAsText(String text) throws IllegalArgumentException {         try {             setValue(dateFormat.parse(text));         } catch (ParseException e) {             e.printStackTrace();         }     } }

定义了CustomDateEditor 后,spring是如何感知并使用这个转换器呢,可以通过CustomEditorConfigurer(继承自BeanFactoryPostProcessor)类,将CustomDateEditor注册到spring的BeanFactory中。CustomEditorConfigurer类说明中有两个使用xml配置的样例,我们这里使用对应的java注解配置方式。

第一种方式:通过 PropertyEditorRegistrar 注册,这也是推荐的方式。

@Configuration public class Config {      @Bean     public CustomEditorConfigurer customEditorConfigurer() {         CustomEditorConfigurer customEditorConfigurer = new CustomEditorConfigurer();         customEditorConfigurer.setPropertyEditorRegistrars(new PropertyEditorRegistrar[]{new DatePropertyEditorRegistrar()});     } }  public class DatePropertyEditorRegistrar implements PropertyEditorRegistrar {      @Override     public void registerCustomEditors(PropertyEditorRegistry registry) {         registry.registerCustomEditor(Date.class, null, new CustomDateEditor());     } }

第二种方式:直接注册自定义的PropertiyEditor

@Configuration public class Config {      @Bean     public CustomEditorConfigurer customEditorConfigurer() {         CustomEditorConfigurer customEditorConfigurer = new CustomEditorConfigurer();          Map<Class<?>, Class<? extends PropertyEditor>> customEditors = new HashMap<>();         customEditors.put(Date.class, CustomDateEditor.class);         customEditorConfigurer.setCustomEditors(customEditors);         return customEditorConfigurer;     }    }

Converter

使用Conveter进行类型转换,在spring boot中有两种使用方式,首先都需要创建一个实现Converter了接口类。

public class CustomDateConverter implements Converter<String, Date> {     @Nullable     @Override     public Date convert(String source) {         try {             return new SimpleDateFormat("yyyy-MM-dd").parse(source);         } catch (ParseException e) {             e.printStackTrace();         }         return null;     } }

第一种方式:使用ConfigurationPropertiesBinding注解。

@Component @ConfigurationPropertiesBinding public class CustomDateConverter implements Converter<String, Date> {     @Nullable     @Override     public Date convert(String source) {         try {             return new SimpleDateFormat("yyyy-MM-dd").parse(source);         } catch (ParseException e) {             e.printStackTrace();         }         return null;     } }

第二种方式:配置名字为”conversionService”的bean。为什么是这个名字,可以参考类:org.springframework.boot.context.properties.ConversionServiceDeducer

@Configuration public class Config {      /**      * {@link ConversionServiceDeducer}      * @return      */     @Bean     public ConversionService conversionService() {         DefaultConversionService service = new DefaultConversionService();         service.addConverter(new CustomDateConverter());         return service;     } }
文章来源: Spring 类型转换
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!