如何在Spring XML配置中设置LocalDateTime

时间:2015-08-12 05:03:49

标签: java xml spring

我的问题涉及以下课程:

public class MyClass {
    private LocalDateTime startDate;
}

我正在尝试使用Spring XML配置设置此bean的startDate属性:

<property name="startDate">
   <value>2000-01-01</value>
</property>

我收到错误:

Cannot convert value of type [java.lang.String] to required type [java.time.LocalDateTime] for property 'startDate'

是否可以使用Spring进行此转换?我在net上找到了如何为Date对象做的例子,但是,LocalDateTime没有构造函数接受一个字符串(并且解决方案似乎需要这样的构造函数)。 LocalDateTime是使用静态方法LocalDateTime.parse构建的。

使用@DateTimeFormat注释,例如:

public class MyClass {
    @DateTimeFormat(iso=ISO.LOCAL_DATE_TIME)
    private LocalDateTime startDate;
}

不是解决方案,因为MyClass必须在Spring之外可用。

提前致谢

4 个答案:

答案 0 :(得分:2)

您可以注册转换。如下面的代码,以下内容将字符串转换为LocalDateTime

class CustomLocalDateTimeEditor extends PropertyEditorSupport {

private final boolean allowEmpty;
private final int exactDateLength;

public CustomLocalDateTimeEditor( boolean allowEmpty) {
    this.allowEmpty = allowEmpty;
    this.exactDateLength = -1;
}

public CustomLocalDateTimeEditor(boolean allowEmpty, int exactDateLength) {
    this.allowEmpty = allowEmpty;
    this.exactDateLength = exactDateLength;
}

@Override
public void setAsText(String text) throws IllegalArgumentException {
    if (this.allowEmpty && !StringUtils.hasText(text)) {
        setValue(null);
    }
    else if (text != null && this.exactDateLength >= 0 && text.length() != this.exactDateLength) {
        throw new IllegalArgumentException("Could not parse date: it is not exactly" + this.exactDateLength + "characters long");
    }
    else {
        try {
            setValue(LocalDateTime.parse(text));
        }
        catch (DateTimeParseException ex) {
            throw new IllegalArgumentException("Could not parse date: " + ex.getMessage(), ex);
        }
    }
}

@Override
public String getAsText() {
    LocalDateTime value = LocalDateTime.parse(String.valueOf(getValue()));
    return (value != null ? value.toString() : "");
}

}

答案 1 :(得分:1)

根据Javy的评论,这是我最终得到的结果:

import java.beans.PropertyEditorSupport;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;

public class CustomLocalDateTimeEditor extends PropertyEditorSupport {

   public CustomLocalDateTimeEditor() {
   }

   private LocalDateTime parseText(String text) {
      LocalDateTime ldt;
      try {
         ldt = LocalDateTime.parse(text);
      } catch(Exception ee) {
         ldt = null;
      }

      if(ldt == null) {
         try {
            ldt = LocalDateTime.of(LocalDate.parse(text), LocalTime.of(0, 0));
         } catch(Exception ee) {
            ldt = null;
         }
      }

      return ldt;
   }

   @Override
   public void setAsText(String text) throws IllegalArgumentException {
      setValue(parseText(text));
   }

   @Override
   public String getAsText() {
      LocalDateTime value = parseText(String.valueOf(getValue()));
      return (value != null ? value.toString() : "");
   }

}

在XML中,我有以下内容:

<bean class="org.springframework.beans.factory.config.CustomEditorConfigurer">
   <property name="customEditors">
      <map>
         <entry key="java.time.LocalDateTime" value="com.mycompany.CustomLocalDateTimeEditor" />
      </map>
   </property>
</bean>

<bean id="myClass" class="MyClass">
   <property name="startDate">
      <value>2000-01-01</value>
   </property>
</bean>

答案 2 :(得分:-1)

您可以使用@DateTimeFormat注释并提供模式。例如

@DateTimeFormat(pattern = "yyyy-MM-dd")
private LocalDateTime startDate;

当Spring找到Joda localdatetime时,它会以适当的格式转换日期。

@DateTimeFormat in spring

答案 3 :(得分:-1)

在“dateFormat”bean中声明一个MyClass bean,引用“dateFormat”bean作为工厂bean。工厂方法将调用SimpleDateFormat.parse()自动将String转换为Date对象。

参考: http://www.mkyong.com/spring/spring-how-to-pass-a-date-into-bean-property-customdateeditor/