17

以下の問題を検索しましたが、答えが見つかりませんでした。

org.springframework.core.convert.converter.Converterを実装するカスタムコンバーターを作成して、Springの変換サービスを使用したいと思います。

次に、カスタムコンバーターを次のように追加します。

<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
    <property name="converters">
        <list>
            <bean id="StringToLoggerConverter" class="com.citi.spring.converter.LoggerConverter" />
       </list>
   </property>
</bean>

上記を実行すると、BeanのconversionServiceをオーバーライドし、カスタムコンバーターのみを登録しているため、アプリケーションの初期化が失敗します。

ConversionServiceをオーバーライドせず、カスタムコンバーターのみをコンバーターのリストに追加し、同時に既存のコンバーターを保持するにはどうすればよいですか?

前もって感謝します。

4

9 に答える 9

4

さまざまな方法を試したり、Spring のソース コードをたどったりしているうちに、興味深いことに出会いました。

既存のコンバーターをカスタム コンバーターでオーバーライドせずに conversionService を使用する唯一の方法は、スーパー クラスの afterPropertiesSet() メソッドを呼び出して conversionService を拡張または再実装して、デフォルトのコンバーターを登録してからカスタム コンバーターを追加することでした。

しかし、その方法を使用していたとしても、実行時に、特定の型 (文字列からロガーなど) のコンバーターが見つからないという例外が発生していました。

それが私の興味を引き起こし、Spring のソース コードをたどってその理由を調べたところ、Spring が PropertyEditor に登録されたカスタム コンバーターを見つけようとしていることに気付きました。なぜこれが起こっているのかわかりません。ここで、私のアプリケーションは spring mvc を使用しておらず、conversionService を登録する必要がある可能性があることを追加する必要がありますが、私はそれを行いませんでした。

最後に、プロパティ エディターを使用してカスタム コンバーターを登録する際の問題を解決しました。このドキュメントは参照として表示できます。

http://static.springsource.org/spring/docs/current/spring-framework-reference/html/validation.html

Spring が登録済みのカスタム コンバーターを conversionService のレジストリで見つけられなかった理由 (または少なくとも、Spring がカスタム コンバーターを見つけるためにそのレジストリを参照しなかった理由) を知りたいと思っています。構成が不足していましたか?

于 2012-10-09T11:01:15.277 に答える
1

Stackoverflowでこれを行うための非常に興味深い方法に出くわしました-https ://stackoverflow.com/a/12760579/204788

コレクションのマージと呼ばれる機能を使用すると、基本的に次のことができます。

<bean id="customConversionService" class="org.springframework.context.support.ConversionServiceFactoryBean" parent="conversionService">
    <property name="converters">
        <list merge="true">
            <bean id="StringToLoggerConverter" class="com.citi.spring.converter.LoggerConverter" />
       </list>
   </property>
</bean>
于 2012-10-08T12:54:51.537 に答える
1

ConversionServiceFactoryBean.afterPropertiesSet() をオーバーライドし、 ConversionService オブジェクトをコンバーターに設定するだけで十分です。ConversionServiceAware など、ConversionService オブジェクトを設定できるインターフェイスをコンバーターに実装させます。唯一の問題は、登録されたコンバーターにアクセスすることなので、'setConverters()' メソッドもオーバーライドする必要があります。

public class MyFormattingConversionServiceFactoryBean extends FormattingConversionServiceFactoryBean {

    private Set<?> cachedConverters = new LinkedHashSet<>();

    @Override
    public void setConverters(Set<?> converters) {
        super.setConverters(converters);
        this.cachedConverters = new LinkedHashSet<>(converters);

    }

    @Override
    public void afterPropertiesSet() {
        super.afterPropertiesSet();
        FormattingConversionService conversionService = getObject();
        for (Object converter : cachedConverters) {
            if (converter instanceof ConversionServiceAware) {
                ((ConversionServiceAware) converter).setConversionService(conversionService);
            }
        }
    }
}
于 2014-04-03T07:43:28.790 に答える
0

カスタム conversionService を書く

public class CustomerConversionServiceFactoryBean extends ConversionServiceFactoryBean {

    List<Converter<Object, Object>> converters = new ArrayList<>();

    public CustomerConversionServiceFactoryBean() {
        super();

    DefaultConversionService conversionservice = (DefaultConversionService)  super.getObject();

        for(int i=0;i<converters.size();i++){
            conversionservice.addConverter(converters.get(i));
        }
    }
}

次にxmlを変更します

<bean id="conversionService"
    class="CustomerConversionServiceFactoryBean" >
    <property name="converters" >
        <list>
            <bean class="CustomConverter"  />
        </list>
    </property>
</bean>

私はこれがあなたを助けると思う...

于 2012-10-08T12:24:35.530 に答える