Spring 및 Pro Spring에서도 설명서를 검색했습니다. CustomerEditorConfigurer가 속성 변환을 적용해야하는 위치를 어떻게 알 수 있는지 이해할 수 없습니다. 예 -Spring PropertyEditor는 변환 할 Class 속성을 어떻게 알 수 있습니까?
날짜 변수 (jodatTime)가있는 연락처 클래스가 있습니다. PropertyEditorSupport를 확장하는 ContactPropertyEditor를 만들고 setAsText()를 사용하여 문자열 날짜를 변환하고 있습니다.
그런 다음 응용 프로그램에 가서 CustomerEditorConfigurer를 정의하여 jodaTime을 ContactPropertyEditor에 매핑하도록 지정합니다. 이제 Spring에는 Contact 클래스가 생성 될 때 ContactPropertyEditor를 사용하여 변환을 수행한다는 정보가 없습니다.
그래서 내 이론을 테스트하기 위해 연락처와 동일한 속성 (날짜)을 가진 다른 클래스 인 Contact2를 만들었습니다. 내가 실행할 때 컨택트 2에서도 변환이 발생하는데, 이는 조금 이상합니다. 여기
는 Contact.javapublic 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 수입 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));
}
}
당신이 내하게 proprty 변환 로직 contactPropertEditor 것을 org.springframework.beans.factory.config.CustomEditorConfigurer 말하고있는 중이 야 모두 볼 수
<?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" />
이제 applicationContext.xml 수업. 나는 Spring에 Contact.java 클래스에 이것을 적용한다고 말하지 않는다.
마법이 어떻게 발생합니까?
스프링 문서에는 이해할만한 것이 있습니다.
Spring 설명서에는 name 속성을 가진 ExoticType()이라는 클래스가 있습니다. ExoticTypeEditor라는 편집기 CALSS는 대문자와 애플리케이션 컨텍스트 XML로 이름을 chaage하는 데 사용됩니다 것은 분명하다
<bean class="org.springframework.beans.factory.config.CustomEditorConfigurer">
<property name="customEditors">
<map>
<entry key="example.ExoticType" value="example.ExoticTypeEditor"/>
</map>
</property>
다음
내가 ExoticTypeEditor를 사용하여 클래스 인 ExoticType에 변환을 적용 위해 CustomEditorConfigurer를 말하고 있음을 알 수 있지만, 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의] 부동산 '생년월일'에 대한 [org.joda.time.DateTime] 필요한 유형 유형의 값을 변환 할 수 없습니다어떤 아이디어가 없습니까?
- 감사합니다. 이제 이해가된다. 그래서 이것은 글로벌 에디터와 같습니다. JodaTime을 사용하는 bean은 영향을받습니다. 그것을 선택적으로 할 방법이 없습니다. 특정 Bean에만 propertyEditor를 적용하고자한다고 가정 해 보겠습니다. –
아니요, 컨테이너는 속성 편집기를 찾을 때 대상 클래스를 확인하지 않습니다. 그러나 빈에서 변환을 구현하거나 컨테이너에 배포 된 다른 bean 메소드에서 반환 된 객체를 삽입 할 수 있습니다. –