我在Spring和Pro Spring中搜索了文档。我不明白CustomerEditorConfigurer如何知道它应该应用属性转换的位置。前 -
我有一个Contact Class,它有一个日期变量(jodatTime) 我创建了一个ContactPropertyEditor,它扩展了PropertyEditorSupport,我使用setAsText()来转换String日期。
然后我进入应用程序并定义CustomerEditorConfigurer,我告诉它将jodaTime映射到ContactPropertyEditor。现在,这里没有告诉Spring的信息,当创建Contact类时,使用ContactPropertyEditor进行转换。
因此,为了测试我的理论,我创建了另一个具有与Contact相同属性(Date)的Contact2类。当我为Contact2运行转换时,这也很奇怪。
这是代码示例 Contact.java
public class Contact {
private String firstName;
private String lastName;
private DateTime birthDate;
private URL personalSite;
public String toString() {
return "First name: " + getFirstName()
+ " - Last name: " + getLastName()
+ " - Birth date: " + getBirthDate()
+ " - Personal site: " + getPersonalSite();
}
// Getter/setter methods omitted
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public DateTime getBirthDate() {
return birthDate;
}
public void setBirthDate(DateTime birthDate) {
this.birthDate = birthDate;
}
public URL getPersonalSite() {
return personalSite;
}
public void setPersonalSite(URL personalSite) {
this.personalSite = personalSite;
}
}
ContactPropertyEditor.java import java.beans.PropertyEditorSupport;
import org.joda.time.DateTime;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;
import org.springframework.stereotype.Component;
public class ContactPropertEditor extends PropertyEditorSupport{
private DateTimeFormatter dateTimeFormatter;
public ContactPropertEditor(String formatPattern){
System.out.println("In the constructor");
dateTimeFormatter=DateTimeFormat.forPattern(formatPattern);
}
public void setAsText(String text) throws IllegalArgumentException{
System.out.println("Setting the value of " + text);
setValue(DateTime.parse(text, dateTimeFormatter));
}
}
的applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
xmlns:util="http://www.springframework.org/schema/util" xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-2.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<context:component-scan base-package="com.dinesh"></context:component-scan>
<context:annotation-config />
<!-- This holds the property values and formats -->
<context:property-placeholder location="classpath:application.properties" />
<bean class="com.dinesh.PropertyEditor.ContactPropertEditor" id="contactPropertEditor">
<constructor-arg><value>"yyyy-MM-dd"</value></constructor-arg>
</bean>
<bean class="org.springframework.beans.factory.config.CustomEditorConfigurer">
<property name="customEditors">
<map>
<entry key="org.joda.time.DateTime">
<ref local="contactPropertEditor" />
</entry>
</map>
</property>
</bean>
<bean id="clarence" class="com.dinesh.PropertyEditor.Contact"
p:firstName="Clarence" p:lastName="Ho" p:birthDate="1970-12-31"
p:personalSite="http://www.clarence.com" />
<bean id="contact2" class="com.dinesh.PropertyEditor.Customer2"
p:firstName="Clarence" p:lastName="Ho" p:birthDate="1970-12-31"
p:personalSite="http://www.clarence.com" />
现在你可以看到我正在做的就是告诉org.springframework.beans.factory.config.CustomEditorConfigurer我的proprty转换逻辑是contactPropertEditor类。我不告诉Spring在Contact.java类上应用它。
魔法是如何发生的。
在Spring文档中,它说的是其他有意义的东西。
Spring文档有一个名为ExoticType()的类,它具有name属性。 名为ExoticTypeEditor的编辑器calss用于将名称追溯到大写,而应用程序上下文xml是明确的
<bean class="org.springframework.beans.factory.config.CustomEditorConfigurer">
<property name="customEditors">
<map>
<entry key="example.ExoticType" value="example.ExoticTypeEditor"/>
</map>
</property>
在这里,我可以看到我告诉CustomEditorConfigurer使用ExoticTypeEditor在类ExoticType上应用转换,但在Pro Spring 3书中并非如此。我试图在Contact Example中做同样的事情但是出错了。
<bean class="org.springframework.beans.factory.config.CustomEditorConfigurer">
<property name="customEditors">
<map>
<entry key="com.dinesh.PropertyEditor.Contact">
<ref local="contactPropertEditor" />
</entry>
</map>
</property>
</bean>
错误:无法将[java.lang.String]类型的值转换为属性“birthDate”所需的类型[org.joda.time.DateTime]:找不到匹配的编辑器或转换策略 < / p>
知道我错过了什么吗?
答案 0 :(得分:1)
在应用程序上下文中注册PropertyEditor
时,您将String
转换为某种类型,在您的情况下为JodaTime
类型。持有类型的bean(Contact
)并不重要。只要需要在任何 bean上将ContactPropertyEditor
类型的属性设置为JodaTime
,应用程序上下文就会使用您的String
编辑器。
所以ContactPropertyEdit
这是一个坏名字。它应该是JodaTimePropertyEditor。
如果你想要真正的ContactPropertyEditor
,它应该将字符串转换为联系人。例如:
<bean id="someBeanHoldingAContact" class="someBeanClass">
<property name="contact" value="Hendrix, Jimi, 1942-11-27, http://www.jimihendrix.com" />
</bean>
并且ContactPropertyEditor应该使用字符串值来创建联系人。
magic 位于org.springframework.beans.BeanWrapperImp
级。参见javadoc
答案 1 :(得分:0)
如果人们用Google搜索此标题试图找到如何在转换时动态获取目标类,则可以尝试使用ConditionalGenericConverter。
相关部分:
检查每个转化请求:
@Override
public Set<ConvertiblePair> getConvertibleTypes() {
return null;//accept everything
}
如果您处理此情况或将其传递给spring默认转换器,请检查何时请求转换:
@Override
public boolean matches(TypeDescriptor sourceType, TypeDescriptor targetType) {
if (sourceType.getType().equals(String.class) && MyInterface.class.isAssignableFrom(targetType.getType()))
return true;
return false;
}
处理转换:
@Override
public Object convert(Object source, TypeDescriptor sourceType, TypeDescriptor targetType) {
output = targetType.getType().newInstance();
//do whatever is required here
return output;
}