为什么我在PropertyEditorSupport
中得到行动?谁能在这里帮我一下,因为我是新来的春天。下面是错误报告
org.springframework.beans.factory.BeanCreationException:在类路径资源[<>之前异常是java.lang.IllegalArgumentException: 888-555-1212原因:java.lang.IllegalArgumentException: 888-555-1212在java.beans.PropertyEditorSupport。setAsText(未知来源)org.springframework.beans.TypeConverterDelegate.doConvertTextValue (TypeConverterDelegate.java: 326)org.springframework.beans.TypeConverterDelegate.doConvertValue (TypeConverterDelegate.java: 305)org.springframework.beans.TypeConverterDelegate.convertIfNecessary (TypeConverterDelegate.java: 192)org.springframework.beans.TypeConverterDelegate.convertIfNecessary (TypeConverterDelegate.java: 138)org.springframework.beans.BeanWrapperImpl.convertForProperty (BeanWrapperImpl.java: 380)org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues (AbstractAutowireCapableBeanFactory.java: 1111)org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean (AbstractAutowireCapableBeanFactory.java: 861)org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean (AbstractAutowireCapableBeanFactory.java: 421)在1.美元org.springframework.beans.factory.support.AbstractBeanFactory getobject (AbstractBeanFactory.java: 251)org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton (DefaultSingletonBeanRegistry.java: 156)org.springframework.beans.factory.support.AbstractBeanFactory.getBean (AbstractBeanFactory.java: 248)org.springframework.beans.factory.support.AbstractBeanFactory.getBean (AbstractBeanFactory.java: 160)org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons (DefaultListableBeanFactory.java: 287)org.springframework.context.support.AbstractApplicationContext.refresh (AbstractApplicationContext.java: 352)在org.springframework.context.support.ClassPathXmlApplicationContext。(ClassPathXmlApplicationContext.java: 91)在org.springframework.context.support.ClassPathXmlApplicationContext。(ClassPathXmlApplicationContext.java: 75)在org.springframework.context.support.ClassPathXmlApplicationContext。(ClassPathXmlApplicationContext.java: 65)在ShowContact.main (ShowContact.java: 9)之前propertyEdit.xml
]中定义名称为'cont'
的bean创建错误:初始化bean失败;org.springframework.beans.TypeMismatchException:无法将类型[java.lang.String
]的属性值转换为属性'phone'
所需的类型[Phone]
;嵌套异常是java.lang.IllegalArgumentException:888-555-1212
org.springframework.beans.TypeMismatchException:无法将类型[java.lang.String]
的属性值转换为属性'phone'
所需的类型[Phone]
;嵌套的
我在下面使用了java.beans.PropertyEditorSupport
public class PhoneEditor extends java.beans.PropertyEditorSupport{
public void setAsTest(String textValue)
{
String stripped = stripNonNumeric(textValue);
String areaCode=stripped.substring(0,3);
String prefix=stripped.substring(3,6);
String number=stripped.substring(6);
Phone phone=new Phone(areaCode,prefix,number);
setValue(phone);
}
private String stripNonNumeric(String original)
{
StringBuffer allNumeric = new StringBuffer();
for(int i=0; i<original.length(); i++)
{
char c=original.charAt(i);
if(Character.isDigit(c))
{
allNumeric.append(c);
}
}
return allNumeric.toString();
}
}
我的配置文件在
下面<bean name="customEditorConfigurer" class="org.springframework.beans.factory.config.CustomEditorConfigurer">
<property name="customEditors">
<map>
<entry key="Phone">
<bean id="Phone" class="PhoneEditor">
</bean>
</entry>
</map>
</property>
</bean>
<bean id="cont" class="Contact">
<property name="name" value="Dhirendra"/>
<property name="phone" value="888-555-1212" />
</bean>
</beans>
电话类在下面
public class Phone {
private String areaCode;
private String prefix;
private String number;
public Phone(){}
public Phone(String areaCode, String prefix, String number)
{
this.areaCode=areaCode;
this.prefix=prefix;
this.number=number;
}
public String getPhoneNumber()
{
return prefix+"-"+areaCode+"-"+number;
}
}
我用下面的方式打电话
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.beans.factory.config.CustomEditorConfigurer;
public class ShowContact {
public static void main(String[] args)
{
ApplicationContext context = new ClassPathXmlApplicationContext("propertyEdit.xml");
Employee employee=(Employee)context.getBean("cont");
employee.PrintEmpDetails();
}
}
下面是我的Contact类,它调用
public class Contact implements Employee {
private Phone phone;
private String name;
public void setPhone(Phone phone) {
// TODO Auto-generated method stub
this.phone=phone;
}
public void setName(String name) {
// TODO Auto-generated method stub
this.name=name;
}
public void PrintEmpDetails()
{
System.out.println("Name of Employee :"+ name);
System.out.println("Contact Number of Employee :"+ phone.getPhoneNumber());
}
}
在PhoneEditor
中,您已经实现了setAsTest
,而不是覆盖setAsText
。结果,Spring在PropertyEditorSupport
中调用setAsText
的实现,这会抛出异常。
这就是为什么你应该总是使用@Override
注释,并设置编译器至少在你不这样做时报告一个警告。
问题是你的类中有一个错别字。它是setAsText,而不是setAsTest:
@Override
public void setAsText(String textValue) throws IllegalArgumentException {
final String stripped = stripNonNumeric(textValue);
final String areaCode=stripped.substring(0,3);
final String prefix=stripped.substring(3,6);
final String number=stripped.substring(6);
final Phone phone=new Phone(areaCode,prefix,number);
setValue(phone);
}
(按照skaffman的建议,总是使用@Override)