我的问题涉及以下课程:
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之外可用。
提前致谢
答案 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时,它会以适当的格式转换日期。
答案 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/