0

SpringとProSpringでドキュメントを検索しました。CustomerEditorConfigurerがプロパティ変換を適用する場所をどのように認識しているかわかりません。元 -

日付変数(jodatTime)を持つContactクラスがあり、PropertyEditorSupportを拡張するContactPropertyEditorを作成し、setAsText()を使用して文字列の日付を変換しています。

次に、アプリケーションに移動して、jodaTimeをContactPropertyEditorにマップするように指示しているCustomerEditorConfigurerを定義します。これには、Contactクラスが作成されたときに、ContactPropertyEditorを使用して変換を行うことをSpringに通知する情報がありません。

そこで、私の理論をテストするために、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に、プロパティ変換ロジックがcontactPropertEditorクラスであることを通知することだけです。これをContact.javaクラスに適用することをSpringに伝えません。

魔法はどのように起こっていますか。

Springのドキュメントでは、意味のある他のことを述べています。

Springのドキュメントには、nameプロパティを持つExoticType()というクラスがあります。ExoticTypeEditorと呼ばれるエディターcalsは、名前を大文字に変更するために使用され、アプリケーションコンテキストxmlは明確です

<bean class="org.springframework.beans.factory.config.CustomEditorConfigurer">
 <property name="customEditors">
   <map>
     <entry key="example.ExoticType" value="example.ExoticTypeEditor"/>
   </map>
 </property>

ここでは、ExoticTypeEditorを使用してクラスExoticTypeに変換を適用するようにCustomEditorConfigurerに指示していることがわかりますが、ProSpring3の本には当てはまりません。連絡先の例で同じことをしようとしましたが、エラーが発生しました。

<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>

エラー:プロパティ'birthDate'のタイプ[java.lang.String]の値を必要なタイプ[org.joda.time.DateTime]に変換できません:一致するエディターまたは変換戦略が見つかりません

私が何を見逃しているのか分かりますか?

4

2 に答える 2

2

PropertyEditorアプリケーションコンテキストでを登録すると、Stringからあるタイプ(この場合はJodaTimeタイプ)へのコンバーターが提供されます。タイプを保持しているBean、(Contact)は関係ありません。アプリケーションコンテキストは、任意のBeanと同様にContactPropertyEditorタイプのプロパティを設定する必要がある場合はいつでもエディタを使用します。JodaTimeString

だから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を参照してください

于 2013-02-22T01:10:03.853 に答える
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;
}
于 2017-02-15T17:08:23.953 に答える