2013-02-21 3 views
0

Spring 및 Pro Spring에서도 설명서를 검색했습니다. CustomerEditorConfigurer가 속성 변환을 적용해야하는 위치를 어떻게 알 수 있는지 이해할 수 없습니다. 예 -Spring PropertyEditor는 변환 할 Class 속성을 어떻게 알 수 있습니까?

날짜 변수 (jodatTime)가있는 연락처 클래스가 있습니다. PropertyEditorSupport를 확장하는 ContactPropertyEditor를 만들고 setAsText()를 사용하여 문자열 날짜를 변환하고 있습니다.

그런 다음 응용 프로그램에 가서 CustomerEditorConfigurer를 정의하여 jodaTime을 ContactPropertyEditor에 매핑하도록 지정합니다. 이제 Spring에는 Contact 클래스가 생성 될 때 ContactPropertyEditor를 사용하여 변환을 수행한다는 정보가 없습니다.

그래서 내 이론을 테스트하기 위해 연락처와 동일한 속성 (날짜)을 가진 다른 클래스 인 Contact2를 만들었습니다. 내가 실행할 때 컨택트 2에서도 변환이 발생하는데, 이는 조금 이상합니다. 여기

는 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 수입 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] 필요한 유형 유형의 값을 변환 할 수 없습니다

어떤 아이디어가 없습니까?

답변

1

응용 프로그램 컨텍스트에서 을 등록 할 경우 String에서 어떤 유형으로 변환기를 제공합니다 (해당 경우 JodaTime 유형). 유형을 보유하는 콩 (Contact)은 중요하지 않습니다.응용 프로그램 컨텍스트는 JodaTime 유형의 등록 정보를 String으로 설정해야 할 때마다 언제든지 ContactPropertyEditor 편집기를 사용합니다. bean에 있습니다.

그래서 ContactPropertyEdit 그것은 나쁜 이름입니다. JodaTimePropertyEditor 여야합니다.

ContactPropertyEditor을 원하면 문자열을 연락처로 변환해야합니다. 예를 들어 :

<bean id="someBeanHoldingAContact" class="someBeanClass"> 
<property name="contact" value="Hendrix, Jimi, 1942-11-27, http://www.jimihendrix.com" /> 
</bean> 

과 ContactPropertyEditor는 연락처를 만들 문자열 값을 사용해야합니다.

마술org.springframework.beans.BeanWrapperImp 클래스입니다. javadoc 참조

+0

- 감사합니다. 이제 이해가된다. 그래서 이것은 글로벌 에디터와 같습니다. JodaTime을 사용하는 bean은 영향을받습니다. 그것을 선택적으로 할 방법이 없습니다. 특정 Bean에만 propertyEditor를 적용하고자한다고 가정 해 보겠습니다. –

+0

아니요, 컨테이너는 속성 편집기를 찾을 때 대상 클래스를 확인하지 않습니다. 그러나 빈에서 변환을 구현하거나 컨테이너에 배포 된 다른 bean 메소드에서 반환 된 객체를 삽입 할 수 있습니다. –

0

사람들이이 제목을봤을 때 변환 시간에 대상 클래스를 동적으로 얻는 방법을 찾으려고 할 때 ConditionalGenericConverter를 대신 사용해 볼 수 있습니다.

관련 부품 :

확인마다 전환 요청 :

@Override 
public Set<ConvertiblePair> getConvertibleTypes() { 
    return null;//accept everything 
} 

확인이 사건을 처리하거나 스프링 기본 컨버터를 통과하면 변환이 요구된다

@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; 
}