Saya memiliki pemformat khusus @Component class DebitCardNumberFormatter implements Formatter<DebitCardNumber>{...} Saya telah menambahkan pemformat ini ke FormattingConversionServiceFactoryBean oleh

<bean id="formattingConversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
        <property name="formatters">
            <set>
                <ref bean="debitCardNumberFormatter"/>
            </set>
        </property>
</bean>

Sekarang ketika saya secara eksplisit menjalankan kode berikut, itu berfungsi dengan benar dan string menjadi DebitCardNumber,

DebitCardNumber debitCardNumber=formattingConversionService.convert("1234-3242
 -4533-3432",DebitCardNumber.class);

Tetapi jika saya mencoba menyuntikkan DebitCardNumber di kacang lain dengan nilai string,

<bean id="cardDetails" class="com.amudhan.springcore.formatter.CardDetails">
        <property name="debitCardNumber" value="1234-3242-4533-3432"></property>
</bean>

Wadah melempar ConversionNotSupportedException.

 org.springframework.beans.ConversionNotSupportedException: Failed to convert property value of type [java.lang.String] to required type [com.amudhan.springcore.formatter.DebitCardNumber] for property 'debitCardNumber'; nested exception is java.lang.IllegalStateException: Cannot convert value of type [java.lang.String] to required type [com.amudhan.springcore.formatter.DebitCardNumber] for property 'debitCardNumber': no matching editors or conversion strategy found`enter code here`
  • Saya membaca dokumentasi Spring dan mempraktikkan API. Apa yang kulewatkan di sini ?
  • Sebelumnya ketika saya membuat 'Converter's, saya menggunakan properti 'converter' dari ConversionServiceFactoryBean untuk menambahkan konverter itu dan menggunakannya secara otomatis.
  • Dengan cara yang sama saya telah mencoba menambahkan formatter dengan menggunakan properti 'formatters' dari FormattingConversionServiceFactoryBean. Adalah ada sesuatu yang pada dasarnya saya lewatkan? Atau Apakah pemahaman saya? dari Formatters jelas salah?
  • Jika It melempar pengecualian ketika saya menggunakan pegas untuk debitCardNumber di applicationContext, kenapa itu berfungsi dengan benar ketika saya memanggil metode konversi secara eksplisit dari aplikasi? Bahkan kacang dibuat dengan benar ketika saya memeriksa.
0
Aravamudhan 13 Juni 2016, 21:12

1 menjawab

Jawaban Terbaik

Ini adalah salah satu cara untuk mendaftarkan formatter kustom Anda

<mvc:annotation-driven conversion-service="conversionService"/>
 <bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
   <property name="formatters">
    <set>
        <ref bean="debitCardNumberFormatter"/>
    </set>
   </property>
 </bean>

Perbarui

Baiklah setelah melihat sedikit lebih dalam ke dalam kode. Jadi pegas mencari kacang layanan konversi dalam konteks aplikasi Anda dengan id "conversionService" di pabrik kacang Abstrak sehingga dapat menggunakannya untuk mengurai kacang Anda alih-alih editor properti (sebelum Spring 3.0).

Jadi sekarang mengapa ini bekerja dengan konverter tetapi bukan pemformat karena nama id Anda untuk pemformat khusus tidak cocok dengan pegas id("conversionService") yang dicari.

Nama lain untuk id tidak akan berfungsi sehingga tidak menjadi masalah antara memilih konverter atau pemformat.

Semoga ini membantu.

Contoh ini dengan formatter seharusnya berfungsi.

 <bean id="conversionService"
          class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
        <property name="formatters">
            <set>
                <ref bean="debitCardNumberFormatter"/>
            </set>
        </property>
    </bean>
1
s7vr 15 Juni 2016, 19:45
Ya. Tapi mengapa tidak bekerja seperti yang saya lakukan ketika konverter bekerja dengan baik? Apakah saya melewatkan sesuatu?
 – 
Aravamudhan
14 Juni 2016, 06:05
Semuanya sama seperti pada konfigurasi XML yang diberikan di atas kecuali, alih-alih "FormattingConversionServiceFactoryBean", sekarang saya memiliki "ConversionServiceFactoryBean" dengan properti konverter alih-alih properti formatter. Saya menyuntikkan konverter khusus alih-alih pemformat seperti yang disebutkan dalam pertanyaan.
 – 
Aravamudhan
14 Juni 2016, 19:02
Diperbarui jawabannya. Silakan lihat.
 – 
s7vr
15 Juni 2016, 19:39
:Terima kasih. Pembaruan Anda membantu dan berhasil. Tapi saya tidak mengerti caranya. Mengapa nama pabrik kacang penting di sini? Karena mengubah nama kacang pabrik menjadi conversionService seperti yang Anda sebutkan, dari formattingConversionService berfungsi dengan benar. Apakah itu berarti objek pabrik membuat kacang menggunakan namanya sendiri ? Jika itu spesifikasinya, lalu kenapa Spring tidak mencari kacang yang cocok dengan kacang pabrik, sebaliknya, secara default mencari kacang bernama conversionService ?
 – 
Aravamudhan
18 Juni 2016, 20:04
Tidak masalah. Hanya ada satu contoh layanan konversi per konteks aplikasi yang dapat menjadi pabrik layanan konversi untuk konverter saja dan pabrik konversi formatter untuk konverter dan formatter. Jadi dengan menggunakan layanan konversi id untuk pabrik di atas, Anda menyediakan implementasi pabrik Anda sendiri yang akan digunakan pegas untuk mengonversi nilai properti string Anda menjadi objek alih-alih editor properti saat menyelesaikan atribut kacang. Untuk semua tujuan lain, Anda dapat mengotomatiskan kacang ini ke aplikasi Anda. Semoga ini membantu.
 – 
s7vr
20 Juni 2016, 07:35